LRU缓存容器有最大的缓存应用限度,超出限度的新增操作会淘汰掉最近起码应用的内容。
实现的思路就是,应用链表来保护淘汰key的优先级,达到最大容量限度就淘汰优先级最低的。
type LRU struct { size int // 限度应用缓存数据个数 ll *list.List // 保护淘汰优先级 m map[string]*list.Element // 存储kv mu sync.Mutex // 竞争同步}type keyValue struct { key string val interface{}}func New(size int) *LRU { lru := &LRU{ size: size, ll: list.New(), m: make(map[string]*list.Element), mu: sync.Mutex{}, } return lru}func (lru *LRU) Add(key string, value interface{}) error { lru.mu.Lock() defer lru.mu.Unlock() if _, ok := lru.m[key]; ok { return errors.New("key already exists in LRU") } if len(lru.m) == lru.size { lru.removeOldest() } val := &keyValue{ key: key, val: value, } ele := lru.ll.PushFront(val) lru.m[key] = ele return nil}func (lru *LRU) removeOldest() { ele := lru.ll.Back() lru.ll.Remove(ele) kv := ele.Value.(*keyValue) delete(lru.m, kv.key)}func (lru *LRU) Get(key string) interface{} { ele, ok := lru.m[key] if ok { lru.ll.MoveToFront(ele) kv := ele.Value.(*keyValue) return kv.val } return nil}