golang-lru
golang-lru copied to clipboard
Support expiring cache use callback
-
support simple expiring caches backed by eviction logic of existing 2q, arc and simple lru:
NewExpiring2Q(size int, expirationTime time.Duration) NewExpiringARC(size int, expirationTime time.Duration) NewExpiringLRU(size int, expirationTime time.Duration)
-
no changes to existing api, no client code change if not using expiring cache.
-
client code can register callback to receive evicted/expired keys/vals.
-
there are 2 expiring policies similar to Guava's CacheBuilder (https://guava.dev/releases/19.0/api/docs/com/google/common/cache/CacheBuilder.html): ExpireAfterWrite and ExpireAfterAccess
-
the default cleanup of expired entries is lazy, only when space is needed for new entries (inside Add) or accurate keys (inside Keys) and size (inside Len) are needed; can add background cleanup by a goroutine periodically calling RemoveAllExpired()
-
following same pattern of simple LRU, separate 2q/arc Cache from LRU, so that XXXCache is just a thread safe wrapper of XXXLRU. this avoids the double locking when ExpiringCache wraps 2Q or ARC.