面经-LRU页面置换算法

649 阅读2分钟

LRU-最近最少使用

:一种删除缓存的算法。当缓存容量的满时候,优先淘汰最近很少使用的数据。

面试官:你知道 LRU算法 —— 缓存淘汰算法吗? - 沙滩de流沙 - 博客园 (cnblogs.com)

假设缓存内部结构,每次查询完,都将数据放到头节点。当插入新的数据时,如果缓存满了。需要删除最后面的数据,再把需要插入的数据放在头节点。

31cfea512f69442fb7e865ea2c9b5204.png ca410d8551e04f13a45e5d5e9ce6f044.png

image.png

- LUR算法实现

使用双向链表加哈希表结合体:

0cf38dd5b736468f99ea4d6b09861095.png

- 优缺点

  • LRU 算法优势在于算法实现难度不大,对于对于热点数据, LRU 效率会很好。
  • LRU 算法劣势在于对于偶发的批量操作,比如说批量查询历史数据,就有可能使缓存中热门数据被这些历史数据替换,造成缓存污染,导致缓存命中率下降,减慢了正常数据查询。

改进 LRU-1到LRU-K

LRU-K是将原先进入缓存队列的评判标准从访问一次改为访问K次。

LRU-K算法有两个队列,一个是缓存队列,一个是数据访问历史队列。当访问一个数据时,首先先在访问历史队列中累加访问次数,当历史访问记录超过K次后,才将数据缓存至缓存队列,从而避免缓存队列被污染。同时访问历史队列中的数据可以按照LRU的规则进行淘汰。

综合来说,使用LRU-2的性能最优。

14d0f4e183694a53b9531aeb32760805.png

改进 冷热分区

把链表分为冷区和热区:

cb3caa96b22f4c769b5b0568293e1216.png

  1. 访问数据如果位于热数据区,与之前 LRU 算法一样,移动到热数据区的头结点。
  2. 插入数据时,若缓存已满,淘汰尾结点的数据。然后将数据插入冷数据区的头结点。
  3. 处于冷数据区的数据每次被访问需要做如下判断:若该数据已在缓存中超过指定时间,比如说 1 s,则移动到热数据区的头结点。若该数据存在在时间小于指定的时间,则位置保持不变

golang实现

LRU和LFU的区别

LRU和LFU 算法(页面置换算法) - 简书 (jianshu.com) image.png