diff --git a/cache.go b/cache.go index f214480..512e61d 100644 --- a/cache.go +++ b/cache.go @@ -42,6 +42,7 @@ type cache struct { items map[string]Item mu sync.RWMutex onEvicted func(string, interface{}) + onEvictedBulk func([]KeyAndValue) janitor *janitor } @@ -902,14 +903,14 @@ func (c *cache) delete(k string) (interface{}, bool) { return nil, false } -type keyAndValue struct { - key string - value interface{} +type KeyAndValue struct { + Key string + Value interface{} } // Delete all expired items from the cache. func (c *cache) DeleteExpired() { - var evictedItems []keyAndValue + var evictedItems []KeyAndValue now := time.Now().UnixNano() c.mu.Lock() for k, v := range c.items { @@ -917,13 +918,20 @@ func (c *cache) DeleteExpired() { if v.Expiration > 0 && now > v.Expiration { ov, evicted := c.delete(k) if evicted { - evictedItems = append(evictedItems, keyAndValue{k, ov}) + evictedItems = append(evictedItems, KeyAndValue{k, ov}) } } } c.mu.Unlock() - for _, v := range evictedItems { - c.onEvicted(v.key, v.value) + // Call evict functions only when + // their respective functions exist. + if c.onEvictedBulk != nil{ + c.onEvictedBulk(evictedItems) + }else if c.onEvicted != nil{ + for _, v := range evictedItems { + c.onEvicted(v.Key, v.Value) + } + }else{ } } @@ -936,6 +944,15 @@ func (c *cache) OnEvicted(f func(string, interface{})) { c.mu.Unlock() } +// Set an optional OnEvictedBulk which will be used to evict keys in bulk +// This is used when eviction happens in bulk when expiry is checked at +// regular intervals, we dont want to call onEvict multiple times +func (c *cache) OnEvictedBulk(f func([]KeyAndValue)) { + c.mu.Lock() + c.onEvictedBulk = f + c.mu.Unlock() +} + // Write the cache's items (using Gob) to an io.Writer. // // NOTE: This method is deprecated in favor of c.Items() and NewFrom() (see the