LRU(Least Recently Used)算法,中文意思是最近最少使用算法。通常用于缓存的淘汰策略。Linux内存管理和Redis内存淘汰策略都使用了LRU算法。
当内存以满,但又有新的内容需要加载进入内存时,就必须淘汰部分内容。淘汰掉内存中未来可能使用最少的数据,保留未来被高频使用数据就成了关键。LRU算法主要思想就是假设:长期不被使用的数据,未来被使用到的概率也不大。LRU的主要数据结构是哈希链表。
算法思想
LRU算法可以借助与Java中的LinkedHashMap实现,LinkedHashMap主要是在HashMap的基础上,节点信息增加了前后的指针以及头指针和尾指针。结构如下图。
LRU增加的内容如下:
- 主要增加一个缓存容量cacheSize(缓存容量)。
- 使用get方法时,需要将被访问节点刷新在队尾(
队尾节点作为最新节点)。 - 使用put方法时,需要判断是否超过cacheSize,超过则删除head节点。然后将新节点放置在队尾
put方法
-
未超过cacheSize时
容量未超过cacheSize时
-
超过cacheSize时。
get方法
需要刷新节点位置
代码实现
代码实现这块,利用LinkedHashMap实现最为简单,只需要重写removeEldestEntry方法即可。如果还想更近一步,了解的话,可以看如何利用HashMap实现。
LinkedHashMap实现
利用HashMap实现
参考
本文参考微信公众号程序员小灰的文章--什么是LRU算法
和掘金用户--动手实现一个 LRU cache