LRU-最近最少使用
:一种删除缓存的算法。当缓存容量的满时候,优先淘汰最近很少使用的数据。
面试官:你知道 LRU算法 —— 缓存淘汰算法吗? - 沙滩de流沙 - 博客园 (cnblogs.com)
假设缓存内部结构,每次查询完,都将数据放到头节点。当插入新的数据时,如果缓存满了。需要删除最后面的数据,再把需要插入的数据放在头节点。
- LUR算法实现
使用双向链表加哈希表结合体:
- 优缺点
- LRU 算法优势在于算法实现难度不大,对于对于热点数据, LRU 效率会很好。
- LRU 算法劣势在于对于偶发的批量操作,比如说批量查询历史数据,就有可能使缓存中热门数据被这些历史数据替换,造成缓存污染,导致缓存命中率下降,减慢了正常数据查询。
改进 LRU-1到LRU-K
LRU-K是将原先进入缓存队列的评判标准从访问一次改为访问K次。
LRU-K算法有两个队列,一个是缓存队列,一个是数据访问历史队列。当访问一个数据时,首先先在访问历史队列中累加访问次数,当历史访问记录超过K次后,才将数据缓存至缓存队列,从而避免缓存队列被污染。同时访问历史队列中的数据可以按照LRU的规则进行淘汰。
综合来说,使用LRU-2的性能最优。
改进 冷热分区
把链表分为冷区和热区:
- 访问数据如果位于热数据区,与之前 LRU 算法一样,移动到热数据区的头结点。
- 插入数据时,若缓存已满,淘汰尾结点的数据。然后将数据插入冷数据区的头结点。
- 处于冷数据区的数据每次被访问需要做如下判断:若该数据已在缓存中超过指定时间,比如说 1 s,则移动到热数据区的头结点。若该数据存在在时间小于指定的时间,则位置保持不变。