sm
/
cache
1
0
Fork 0

cache changes for evictBulk

This commit is contained in:
Pranjal Pandit 2016-09-15 18:47:54 +05:30
parent 738ddeb7e2
commit 71bfe9e709
1 changed files with 24 additions and 7 deletions

View File

@ -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