LRU全称是Least Recently Used,即最近最久未使用的意思。他的设计思想是基于访问的时间局部性(temporal locality)。它是一种内存淘汰算法,当内存不够时,将内存中最久没使用的数据清理掉。LRU算法常用于缓存的淘汰策略。
LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小,另一种描述是“如果数据最近被访问过,那么将来被访问的几率也更高。”。也就是说,当缓存容量达到上限时,应当把最久没有被访问到的数据淘汰。
常见的其他缓存算法有:先进先出算法(FIFO, First In First Out)、最不经常使用算法(LFU, Least Frequently Used)
主要应用场景是缓存,缓存规则如下。
①.最近被使用或访问的数据放置在最前面;
②.没当缓存命中(即缓存数据被访问)则将数据移到头部;
③.当缓存数量达到最大值时,将最近最少访问的数据剔除;
LRU实现大致有两种方法:
1、记录缓存数据的时间戳,当需要淘汰数据时,对比时间戳找出最早的数据进行淘汰,命中缓存时更新时间戳。但是该方法查找和淘汰都比较慢,且需要额外记录时间戳数据
2、利用链表的特性,链表头部为最新的数据,一旦命中缓存,则将命中数据移动到链表头部,如果缓存数据达到容量上限则从链表尾部淘汰数据。
由于缓存一般具有大量反复读写的特性,因此对查找、插入、更新、淘汰数据时间复杂度要求较高,对于链表查找、更新数据都为O(n),如要实现缓存快速查找和更新,需要额外的数据结构,一般采用双向链表+hashMap来实现LRU缓存算法。