常见的缓存剔除策略 & 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的区别的主要内容,如果未能解决你的问题,请参考以下文章