一 什么是LRU缓存
LRU(英文:Least Recently Used),中文叫做最近最少使用缓存。也就是说,我们设计一个固定最大容量的缓存,当达到最大容量之后,我们再往缓存里放数据时,会先把最近最少使用的那个元素删除,再放入最新的元素。
为什么要设计“固定最大容量的缓存”?在生产环境,每一份内存都是非常宝贵的,如果不设置最大容量上限,元素无休止的增长,总缓存大小势必会达到系统阈值或者内存大小,容易抛出OutOfMemoryError。
二 为什么我们要自己实现LRU缓存
很多语言里面没有开箱即用的LRU缓存工具。包括Java、Python、Go等等。最像LRU缓存的是Java中的LinkedHashMap,它是由HashMap实现的,里面的元素通过链表串起来,但是无法设置最大容量,不断往里面放元素还是会导致它无限制增长。
三 要实现LRU缓存,我们的诉求是什么
从上面的说法,我们得出,我们的LRU缓存需要具备:
- 快速存取元素。
- 有固定的最大容量,不会无限制增长。
- 达到最大容量后,再往缓存里面放入新元素时,会先把最近最少使用的元素删除,再放入新元素。
四 怎么来实现
有了诉求只有,我们的目的很明确,接下来就是如何实现了。
- 第一点诉求,快速存取。我们使用map(哈希表、映射)就可以了。
- 第二点诉求,固定最大容量。我们给这个map增加capacity(整数)字段来表示最大容量,当map中元素个数达到capacity时,我们要继续往里面放入新元素,则先把最近最少使用的元素删除再放入新元素。
- 第三点诉求,删除最近最少使用的元素。怎么找到最近最少使用的元素删除?这个也很简单,参考Java中的LinkedHashMap的做法,把map中的元素使用双向链表串起来,把最近最少使用的元素放在队列尾部,最近最常使用的元素放在头部就可以了。
4.1 设计Entry
我们知道,元素要放入map里面,那我们元素必须具备key和value字段。元素要用双向链表串起来,那元素必须具备pre和next字段。我们的Entry设计如下:
type Entry struct {
Key string
Value interface{}
pre *Entry
next *Entry
}
4.2 设计缓存
Entry设计完成,我们开始设计缓存。我们自定义缓存类型,里面使用map来存放缓存的元素,cap

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



