Feature: lru cache add evict callback
This commit is contained in:
parent
88e7005382
commit
6b3a92e7f2
2 changed files with 35 additions and 0 deletions
14
common/cache/lrucache.go
vendored
14
common/cache/lrucache.go
vendored
|
@ -11,6 +11,16 @@ import (
|
||||||
// Option is part of Functional Options Pattern
|
// Option is part of Functional Options Pattern
|
||||||
type Option func(*LruCache)
|
type Option func(*LruCache)
|
||||||
|
|
||||||
|
// EvictCallback is used to get a callback when a cache entry is evicted
|
||||||
|
type EvictCallback func(key interface{}, value interface{})
|
||||||
|
|
||||||
|
// WithEvict set the evict callback
|
||||||
|
func WithEvict(cb EvictCallback) Option {
|
||||||
|
return func(l *LruCache) {
|
||||||
|
l.onEvict = cb
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// WithUpdateAgeOnGet update expires when Get element
|
// WithUpdateAgeOnGet update expires when Get element
|
||||||
func WithUpdateAgeOnGet() Option {
|
func WithUpdateAgeOnGet() Option {
|
||||||
return func(l *LruCache) {
|
return func(l *LruCache) {
|
||||||
|
@ -42,6 +52,7 @@ type LruCache struct {
|
||||||
cache map[interface{}]*list.Element
|
cache map[interface{}]*list.Element
|
||||||
lru *list.List // Front is least-recent
|
lru *list.List // Front is least-recent
|
||||||
updateAgeOnGet bool
|
updateAgeOnGet bool
|
||||||
|
onEvict EvictCallback
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewLRUCache creates an LruCache
|
// NewLRUCache creates an LruCache
|
||||||
|
@ -148,6 +159,9 @@ func (c *LruCache) deleteElement(le *list.Element) {
|
||||||
c.lru.Remove(le)
|
c.lru.Remove(le)
|
||||||
e := le.Value.(*entry)
|
e := le.Value.(*entry)
|
||||||
delete(c.cache, e.key)
|
delete(c.cache, e.key)
|
||||||
|
if c.onEvict != nil {
|
||||||
|
c.onEvict(e.key, e.value)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type entry struct {
|
type entry struct {
|
||||||
|
|
21
common/cache/lrucache_test.go
vendored
21
common/cache/lrucache_test.go
vendored
|
@ -115,3 +115,24 @@ func TestMaxSize(t *testing.T) {
|
||||||
_, ok = c.Get("foo")
|
_, ok = c.Get("foo")
|
||||||
assert.False(t, ok)
|
assert.False(t, ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestExist(t *testing.T) {
|
||||||
|
c := NewLRUCache(WithSize(1))
|
||||||
|
c.Set(1, 2)
|
||||||
|
assert.True(t, c.Exist(1))
|
||||||
|
c.Set(2, 3)
|
||||||
|
assert.False(t, c.Exist(1))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEvict(t *testing.T) {
|
||||||
|
temp := 0
|
||||||
|
evict := func(key interface{}, value interface{}) {
|
||||||
|
temp = key.(int) + value.(int)
|
||||||
|
}
|
||||||
|
|
||||||
|
c := NewLRUCache(WithEvict(evict), WithSize(1))
|
||||||
|
c.Set(1, 2)
|
||||||
|
c.Set(2, 3)
|
||||||
|
|
||||||
|
assert.Equal(t, temp, 3)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue