常见的缓存剔除策略 & LRU与LFU的区别

Posted 架构师之殇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见的缓存剔除策略 & LRU与LFU的区别相关的知识,希望对你有一定的参考价值。

常见的缓存剔除策略有

FIFO(First In First Out) 先进先出,淘汰最早数据。

LRU (Least Recently Used)剔除最近最少使用。

LFU (Least Frequently Used)剔除最近使用频率最低的数据。

FIFO 先进先出好理解,LRU与LFU让人有点迷糊,百度百科的解释傻傻有点分不清楚。

找了些资料,举个例子来理理。

如果缓存中有数据如下:

姚毛毛 | 沉默王二 | 纯洁的微笑

而缓存中只能存放3个数据,现在需要新增一个数据:

java极客技术

意味着要剔除一个缓存数据。

而此时的缓存记录了最近一段时间的访问顺序,从最远到最近,依次是:

姚毛毛 | 沉默王二 | 姚毛毛 | 纯洁的微笑 | 姚毛毛 | 沉默王二 | 纯洁的微笑

按照LRU规则,会将姚毛毛淘汰,因为是最长时间未被使用的,“沉默王二” 、“纯洁的微笑”都在“姚毛毛”其后被使用过。

所以LRU的缺点也很明显,高频率但最近未被使用数据可能会被剔除。
可能会由于一次冷数据的批量查询而误导大量热点的数据。

明明我“姚毛毛”才是被查询最多次的对不对?

而按照LFU的规则,则是沉默王二被淘汰。

为什么?出现频率不都是两次么?

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

简单来说并列倒数第一时,即频率相同、时间最远的淘汰。

不管你们懂没懂,我自己是懂了。

不管这个解释有没有错,我自己是相信了。



关注了我,你的生命中又多了个有趣的灵魂。


姚毛毛&妖生

一个只做原创的程序员

微信扫码关注他




以上是关于常见的缓存剔除策略 & LRU与LFU的区别的主要内容,如果未能解决你的问题,请参考以下文章

redis缓存常见问题

LRU与LFU比较

缓存机制

缓存失效策略(FIFO,LRU,LFU)

缓存策略

FIFO与LRU实现(Java)