缓存淘汰算法系列之3——FIFO类

简介:

缓存淘汰算法系列之3——FIFO类

1 FIFO

1.1. 原理

按照“先进先出(First In,First Out)”的原理淘汰数据。

1.2. 实现

FIFO队列,具体实现如下:

1. 新访问的数据插入FIFO队列尾部,数据在FIFO队列中顺序移动;

2. 淘汰FIFO队列头部的数据;

1.3. 分析

l 命中率

命中率很低,因为命中率太低,实际应用中基本上不会采用。

l 复杂度

简单

l 代价

实现代价很小。

2. Second Chance

2.1. 原理

FIFO算法的改进版,其思想是“如果被淘汰的数据之前被访问过,则给其第二次机会(Second Chance)”。

2.2. 实现

每个数据会增加一个访问标志位,用于标识此数据放入缓存队列后是否被再次访问过。

如上图,A是FIFO队列中最旧的数据,且其放入队列后没有被再次访问,则A被立刻淘汰;否则如果放入队列后被访问过,则将A移到FIFO队列头,并且将访问标志位清除。

如果所有的数据都被访问过,则经过一次循环后就会按照FIFO的原则淘汰数据。

2.3. 分析

l 命中率

命中率比FIFO高。

l 复杂度

与FIFO相比,需要记录数据的访问标志位,且需要将数据移动。

l 代价

实现代价比FIFO高。

3. Clock

3.1. 原理

Clock是Second Chance的改进版,通过一个环形队列,避免将数据在FIFO队列中移动。

3.2. 实现

如上图,其具体实现如下:

l 当前指针指向C,如果C被访问过,则清除C的访问标志,并将指针指向D;

l 如果C没有被访问过,则将新数据插入到C的位置,将指针指向D。

3.3. 分析

l 命中率

命中率比FIFO高,和Second Chance一样。

l 复杂度

与FIFO相比,需要记录数据的访问标志位,且需要将数据指针移动。

l 代价

实现代价比FIFO高,比Second Chance低。

4. FIFO类算法对比

对比点

对比

命中率

Clock =  Second Chance > FIFO

复杂度

Second Chance  > Clock > FIFO

代价

Second Chance  > Clock > FIFO

由于FIFO类算法命中率相比其他算法要低不少,因此实际应用中很少使用此类算法。

相关文章
|
2月前
|
存储 缓存 算法
缓存淘汰策略
缓存淘汰策略
33 0
|
2月前
|
机器学习/深度学习 算法
【优选算法】—— 滑动窗口类问题
【优选算法】—— 滑动窗口类问题
|
2月前
|
机器学习/深度学习 算法
【数学建模竞赛】评价类赛题常用算法解析
【数学建模竞赛】评价类赛题常用算法解析
43 0
|
4月前
|
搜索推荐 算法
11.经典 O(n²)比较类排序算法
11.经典 O(n²)比较类排序算法
44 0
|
4月前
|
搜索推荐 算法
经典 O(n²)比较类排序算法
经典 O(n²)比较类排序算法
36 0
|
4月前
|
缓存 算法 NoSQL
【分布式详解】一致性算法、全局唯一ID、分布式锁、分布式事务、 分布式缓存、分布式任务、分布式会话
分布式系统通过副本控制协议,使得从系统外部读取系统内部各个副本的数据在一定的约束条件下相同,称之为副本一致性(consistency)。副本一致性是针对分布式系统而言的,不是针对某一个副本而言。强一致性(strong consistency):任何时刻任何用户或节点都可以读到最近一次成功更新的副本数据。强一致性是程度最高的一致性要求,也是实践中最难以实现的一致性。单调一致性(monotonic consistency):任何时刻,任何用户一旦读到某个数据在某次更新后的值,这个用户不会再读到比这个值更旧的值。
416 0
|
6天前
|
缓存 算法
LRU(Least Recently Used)算法是一种常用的计算机缓存替换算法
LRU算法是基于页面使用频率的缓存策略,优先淘汰最近最久未使用的页面。实现可采用双向链表或数组,前者灵活,后者时间复杂度低。优点是利用时间局部性提高命中率,简单易实现;缺点是占用空间,对循环访问和随机访问场景适应性不佳。
23 0
|
12天前
|
存储 缓存 算法
面试遇到算法题:实现LRU缓存
V哥的这个实现的关键在于维护一个双向链表,它可以帮助我们快速地访问、更新和删除最近最少使用的节点,同时使用哈希表来提供快速的查找能力。这样,我们就可以在 O(1) 的时间复杂度内完成所有的缓存操作。哈哈干净利索,回答完毕。
|
17天前
|
缓存 算法 Java
淘汰算法
【4月更文挑战第21天】这篇内容介绍了两种主流的淘汰算法:LRU(Least Recently Used)和LFU(Least Frequently Used)。LRU基于最近最少使用原则,当缓存满时,淘汰最近最久未使用的键。实现上通常使用链表和Java的LinkedHashMap。而LFU根据访问次数淘汰最不常使用的对象,可以按访问频率排序并选择淘汰。LFU的变种可能关注一定时间窗口内的访问次数,实现上更复杂。
19 1
|
1月前
|
缓存 算法 Java
如何实现缓存与LRU算法以及惰性过期
如何实现缓存与LRU算法以及惰性过期
32 1