| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- 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
- }
|