LRU算法

1,649 阅读2分钟

LRU(Least Recently Used)算法,中文意思是最近最少使用算法。通常用于缓存的淘汰策略Linux内存管理Redis内存淘汰策略都使用了LRU算法。

当内存以满,但又有新的内容需要加载进入内存时,就必须淘汰部分内容。淘汰掉内存中未来可能使用最少的数据,保留未来被高频使用数据就成了关键。LRU算法主要思想就是假设:长期不被使用的数据,未来被使用到的概率也不大。LRU的主要数据结构是哈希链表

算法思想

LRU算法可以借助与Java中的LinkedHashMap实现,LinkedHashMap主要是在HashMap的基础上,节点信息增加了前后的指针以及头指针和尾指针。结构如下图。

LinkedHashMap数据结构

LRU增加的内容如下:

  • 主要增加一个缓存容量cacheSize(缓存容量)。
  • 使用get方法时,需要将被访问节点刷新在队尾(队尾节点作为最新节点)。
  • 使用put方法时,需要判断是否超过cacheSize,超过则删除head节点。然后将新节点放置在队尾

put方法

  • 未超过cacheSize时

    容量未超过cacheSize时
  • 超过cacheSize时。

新增容量超过cacheSize

get方法

需要刷新节点位置

执行put方法时

代码实现

代码实现这块,利用LinkedHashMap实现最为简单,只需要重写removeEldestEntry方法即可。如果还想更近一步,了解的话,可以看如何利用HashMap实现。

LinkedHashMap实现

LinkedHashMap实现LRU

利用HashMap实现

LinkedHashMap实现LRU

参考

本文参考微信公众号程序员小灰的文章--什么是LRU算法

和掘金用户--动手实现一个 LRU cache