decision function to evict cache on expiration

add-license-1 v0.0.4
Basit Ali 2022-04-05 16:55:25 +05:00
parent d0a7fc26e1
commit 9b5a155a44
2 changed files with 11 additions and 6 deletions

View File

@ -8,6 +8,9 @@ func (cache *myCache) deleteExpired() {
now := time.Now().UnixNano() now := time.Now().UnixNano()
for k, v := range cache.items { for k, v := range cache.items {
if cache.decisionFunc != nil && !cache.decisionFunc(v) {
continue
}
if v.expiration > 0 && now > v.expiration { if v.expiration > 0 && now > v.expiration {
delete(cache.items, k) delete(cache.items, k)
} }

View File

@ -10,6 +10,7 @@ type myCache struct {
mutex sync.Mutex mutex sync.Mutex
items map[string]*value items map[string]*value
expireAfter int64 expireAfter int64
decisionFunc func(v interface{}) bool
} }
func NewCache() Cache { func NewCache() Cache {
@ -18,10 +19,11 @@ func NewCache() Cache {
} }
} }
func NewCacheWithSweeper(interval, expireAfter time.Duration) Cache { func NewCacheWithSweeper(interval, expireAfter time.Duration, decisionFunc func(v interface{}) bool) Cache {
c := &myCache{ c := &myCache{
items: make(map[string]*value), items: make(map[string]*value),
expireAfter: expireAfter.Nanoseconds(), expireAfter: expireAfter.Nanoseconds(),
decisionFunc: decisionFunc,
} }
if interval > 0 && expireAfter > 0 { if interval > 0 && expireAfter > 0 {