两种常见的缓存淘汰算法LFU&LRU

转载 2016年02月13日 21:47:30

1. LFU

1.1. 原理

LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。

1.2. 实现

LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序。

具体实现如下:

 

1. 新加入数据插入到队列尾部(因为引用计数为1);

2. 队列中的数据被访问后,引用计数增加,队列重新排序;

3. 当需要淘汰数据时,将已经排序的列表最后的数据块删除。

1.3. 分析

l 命中率

一般情况下,LFU效率要优于LRU,且能够避免周期性或者偶发性的操作导致缓存命中率下降的问题。但LFU需要记录数据的历史访问记录,一旦数据访问模式改变,LFU需要更长时间来适用新的访问模式,即:LFU存在历史数据影响将来数据的“缓存污染”效用。

l 复杂度

需要维护一个队列记录所有数据的访问记录,每个数据都需要维护引用计数。

l 代价

需要记录所有数据的访问记录,内存消耗较高;需要基于引用计数排序,性能消耗较高。


2. LRU
2.1. 原理

LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

2.2. 实现

最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:


1. 新数据插入到链表头部;

2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;

3. 当链表满的时候,将链表尾部的数据丢弃。

2.3. 分析

【命中率】

当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重。

【复杂度】

实现简单。

【代价】

命中时需要遍历链表,找到命中的数据块索引,然后需要将数据移到头部。


3. LRU-K

3.1. 原理

LRU-K中的K代表最近使用的次数,因此LRU可以认为是LRU-1。LRU-K的主要目的是为了解决LRU算法“缓存污染”的问题,其核心思想是将“最近使用过1次”的判断标准扩展为“最近使用过K次”。

3.2. 实现

相比LRU,LRU-K需要多维护一个队列,用于记录所有缓存数据被访问的历史。只有当数据的访问次数达到K次的时候,才将数据放入缓存。当需要淘汰数据时,LRU-K会淘汰第K次访问时间距当前时间最大的数据。详细实现如下:


1. 数据第一次被访问,加入到访问历史列表;

2. 如果数据在访问历史列表里后没有达到K次访问,则按照一定规则(FIFO,LRU)淘汰;

3. 当访问历史队列中的数据访问次数达到K次后,将数据索引从历史队列删除,将数据移到缓存队列中,并缓存此数据,缓存队列重新按照时间排序;

4. 缓存数据队列中被再次访问后,重新排序;

5. 需要淘汰数据时,淘汰缓存队列中排在末尾的数据,即:淘汰“倒数第K次访问离现在最久”的数据。

LRU-K具有LRU的优点,同时能够避免LRU的缺点,实际应用中LRU-2是综合各种因素后最优的选择,LRU-3或者更大的K值命中率会高,但适应性差,需要大量的数据访问才能将历史访问记录清除掉。

3.3. 分析

【命中率】

LRU-K降低了“缓存污染”带来的问题,命中率比LRU要高。

【复杂度】

LRU-K队列是一个优先级队列,算法复杂度和代价比较高。

【代价】

由于LRU-K还需要记录那些被访问过、但还没有放入缓存的对象,因此内存消耗会比LRU要多;当数据量很大的时候,内存消耗会比较可观。

LRU-K需要基于时间进行排序(可以需要淘汰时再排序,也可以即时排序),CPU消耗比LRU要高。


LRU和LFU的区别

LRU和LFU是不同的! LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面! LFU是最近最不常用页面置换算法(Least Freq...
  • summerhust
  • summerhust
  • 2011年10月12日 17:20
  • 52127

FIFO、LRU、LFU的含义和原理

题目:请简要介绍FIFO、LRU、LFU的含义和原理 含义: FIFO:First In First Out,先进先出 LRU:Least Recently Used...
  • yangpl_tale
  • yangpl_tale
  • 2015年04月11日 20:06
  • 11437

基于最少使用频次的LRU,LFU缓存淘汰算法

概念分析 LFU(Least Frequently Used)即最近最不常用.看名字就知道是个基于访问频次的一种算法。以前写过几篇关于用python实现lru算法的模块,有兴趣的朋友可以看看。 L...
  • zmken497300
  • zmken497300
  • 2017年09月06日 15:16
  • 228

几种缺页中断算法(FIFO,LRU与LFU)的实现过程

几种缺页中断算法(FIFO,LRU与LFU)的实现过程 2015-09-05 20:34:02 分类: LINUX   最近在做笔试题,其中虚拟存储管理中几种缺页中断算...
  • jfkidear
  • jfkidear
  • 2016年10月13日 22:36
  • 2494

页面置换算法--LFU算法实现-O(1)时间复杂度

LFU: least frequently used (LFU) page-replacement algorithmleetcode题目地址https://leetcode.com/problems...
  • qq_26437925
  • qq_26437925
  • 2017年02月21日 10:50
  • 1500

Lintcode24 LFU Cache solution 题解

【题目描述】 LFU (Least Frequently Used) is a famous cache eviction algorithm.For a cache with capaci...
  • jane_silva
  • jane_silva
  • 2017年04月16日 20:52
  • 272

LRU算法及例题讲解

概念: LRU(least recently used)是将近期最不会访问的数据给淘汰掉,其实LRU是认为最近被使用过的数据,那么将来被访问的概率也多,最近没有被访问,那么将来被访问的概率也比较低“,...
  • xiao_Mrs_li
  • xiao_Mrs_li
  • 2017年04月05日 15:46
  • 4146

LRU算法实现

最近发现LRU在缓存使用的较多,特意回头来看看自己以前上机实现的代码原理: 最近最久未使用页面置换算法(LRU) 当需要淘汰某一页时,选择在最近一段时间里最久没有被使用过的页淘汰。 其基本原理为...
  • qq_24486393
  • qq_24486393
  • 2016年08月31日 17:08
  • 1244

LRU算法

LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的,是根据页面调入内存后的使用情况进行决策了。由于无法预测各页面将来的使用情况,只能利用“最近...
  • luoweifu
  • luoweifu
  • 2012年12月14日 22:53
  • 28275

关于LRU算法

一,LRU 原理 LRU(Least Recently Used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 ...
  • mysteryhaohao
  • mysteryhaohao
  • 2016年04月06日 10:24
  • 2036
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:两种常见的缓存淘汰算法LFU&LRU
举报原因:
原因补充:

(最多只允许输入30个字)