1. LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
2. 实现
最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:
1. 新数据插入到链表头部;
2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;
3. 当链表满的时候,将链表尾部的数据丢弃。
3. 分析
【命中率】
当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重。
【复杂度】
实现简单。
【代价】
命中时需要遍历链表,找到命中的数据块索引,然后需要将数据移到头部。
4. LRU在golang中的使用。
库:github.com/karlseguin/ccache
func main() { var cache = ccache.New(ccache.Configure().MaxSize(1000).ItemsToPrune(100)) cache.Set("aaa", 1234, time.Second) time.Sleep(time.Second*2) i := cache.Get("aaa") fmt.Println(i.Value(), i.Expires()) }
ccache 库,在golang中应用中对于内存存储使用比较频繁次数比较多的,可以考虑用LRU。