缓存基础----缓存数据淘汰策略

目录

一、FIFO算法

二、LFU算法

三、LRU算法

四、Two queues(2Q)算法


不管是本地缓存还是分布式缓存,为了保证系统的高性能和高可用,都是使用内存来存储数据的。随着时间的推移,缓存的数据越来越多,由于成本和内存的限制,当存储的数据超过缓存最大容量时,需要对缓存的数据进行淘汰。常用的缓存淘汰策略有FIFO(先进先出算法)、LFU(Least Frequently Used)、LRU(Least Recently Used)等。

一、FIFO算法

FIFO(First in First out)算法,先进先出。

核心设计原则是:最先进入缓存的数据最先被淘汰。

淘汰过程:

1、利用一个双向链表作为缓存来存储数据;

2、当来了新的数据以后,把数据添加在链表的尾部;

3、如果缓存的数据达到了最大存储容量,则删除最先进入链表头部的数据;

4、然后将最新的数据添加在链表尾部;

5、在访问数据的时候,如果缓存中存在数据就返回value值,如果没有数据就返回-1;

FIFO算法存在的问题:

这种绝对公平的数据淘汰方式容易导致效率的降低。比如,如果最先加载进来的数据是经常被访问的数据,当数据存储达到最大容量时,淘汰最先进来的热点数据。当再次访问时,需要去数据库磁盘中获取,从而降低了效率。

二、LFU算法

LFU(Least Frequently Used)算法,淘汰最近不频繁使用的数据,是以数据的访问次数为参考。当两个数据的访问次数相同时,对比两个数据的访问时间,淘汰最后访问时间长的数据。

核心设计原则是:最近使用频率高的数据很大概率将会再次被使用,而最近使用频率低的数据,很大概率不会再使用。

淘汰过程:

1、新加入的数据放在队列的尾部,因为是新加入的引用计数为1;

2、当队列中的数据被访问后,引用计数增加,数据顺序重新排列,访问次数多的排在前面;

3、当访问的两个数据次数相同时,比较两个数据的最后访问时间;

4、如果缓存达到了存储数据最大容量时,淘汰掉排列在链表尾部的数据;

LFU算法存在的问题:

某些缓存的数据在短时间内被频繁访问,并且在之后很长的一段时间内不会被访问。由于这些数据的引用次数急剧增加,即使在后面一段时间内不会被访问,在短时间内也不会被淘汰。相反在之后的一段时间内将会被频繁访问的数据,由于之前没有被访问引用计数值比较低,当缓存达到最大容量时,这些数据可能会被淘汰。

三、LRU算法

LRU(Least Recently Used)算法,淘汰最近最少使用的数据,以数据的访问时间为 参考。

核心设计原则是:如果一个数据在最近一段时间没有被访问到,那么将来这个数据被访问到的可能性也很小。所以当缓存达到最大容量时,应该把最近最少使用的数据淘汰。

淘汰过程:

1、新添加数据的时候,将数据添加在队列的头部;

2、访问数据的时候,缓存中的数据被命中,将数据移动到队列的头部;

3、如果此时缓存达到最大容量时,淘汰队列尾部的数据;

LRU算法存在的问题:

当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重。比如某个时间段内频繁访问A数据,接着访问不同的数据B和C直到数据A被淘汰,此时再次访问A数据的时候还得从DB中获取然后存储在缓存中。而保存在缓存中的数据B和数据C只是访问一次的,这样显然是不合适的。

四、Two queues(2Q)算法

2Q算法,它有两个缓存队列,一个是FIFO队列,一个是LRU队列。

核心设计原则是:当某个数据第一次被访问时,2Q算法将数据缓存在FIFO队列里面,当数据第二次被访问时,则将数据从FIFO队列移到LRU队列里面,两个队列各自按照自己的方法淘汰数据。

淘汰过程:

1、某个数据第一次被访问时插入到FIFO队列;

2、如果该数据在FIFO队列中一直没有被再次访问,则最终按照FIFO规则淘汰;

3、如果数据在FIFO队列中被再次访问,则将数据移到LRU队列头部;

4、如果数据在LRU队列再次被访问,则将数据移到LRU队列头部;

5、当LRU队列缓存容量达到最大值时,淘汰队列尾部的数据;

2Q算法存在的问题:

2Q算法的命中率要高于LRU,但是比LRU-K算法的命中率低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值