You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
936 B
52 lines
936 B
package utils
|
|
|
|
import (
|
|
"container/list"
|
|
)
|
|
|
|
type CacheEntry struct {
|
|
key int64
|
|
value []byte
|
|
}
|
|
|
|
type LruCache struct {
|
|
capacity int
|
|
ll *list.List
|
|
cache map[int64]*list.Element
|
|
}
|
|
|
|
func NewLRUCache(capacity int) *LruCache {
|
|
return &LruCache{
|
|
capacity: capacity,
|
|
ll: list.New(),
|
|
cache: make(map[int64]*list.Element),
|
|
}
|
|
}
|
|
|
|
func (c *LruCache) Get(key int64) ([]byte, bool) {
|
|
if ele, ok := c.cache[key]; ok {
|
|
c.ll.MoveToFront(ele)
|
|
return ele.Value.(*CacheEntry).value, true
|
|
}
|
|
return nil, false
|
|
}
|
|
|
|
func (c *LruCache) Put(key int64, value []byte) {
|
|
if ele, ok := c.cache[key]; ok {
|
|
c.ll.MoveToFront(ele)
|
|
ele.Value.(*CacheEntry).value = value
|
|
return
|
|
}
|
|
|
|
if c.ll.Len() >= c.capacity {
|
|
oldest := c.ll.Back()
|
|
if oldest != nil {
|
|
c.ll.Remove(oldest)
|
|
delete(c.cache, oldest.Value.(*CacheEntry).key)
|
|
}
|
|
}
|
|
|
|
entry := &CacheEntry{key, value}
|
|
ele := c.ll.PushFront(entry)
|
|
c.cache[key] = ele
|
|
}
|