caffeine框架 W-TinyLFU算法详解

参考链接:

1.用法:Caffeine Cache-高性能Java本地缓存组件 - rickiyang - 博客园

2.核心原理:  https://www.jianshu.com/p/3c6161e5337b

节选自上述文章最核心部分:

W-TinyLFU算法的框架如下所示:

W-TinyLFU算法原理

W-TinyLFU将缓存存储空间分为两个大的区域:Window Cache和Main Cache,Window Cache是一个标准的LRU Cache,Main Cache则是一个SLRU(Segmemted LRU)cache,因为Main Cache进一步划分为Protected Cache(保护区)和Probation Cache(观察区)两个区域,这两个区域都是基于LRU的Cache。protected是一个受保护的区域,该区域中的缓存项不会被淘汰。Probation区域则是一个观察区,当有新的缓存项需要进入Probation区时,如果Probation区空间已满,则会将新进入的缓存项与Probation区中根据LRU规则需要被淘汰(evict)的缓存项进行比较,比较失败的缓存项会被淘汰,获胜的缓存项会进入或保留在Probation区。Window Cache默认为cache总大小的1%,Main Cache默认为cache总大小的99%。Protected Cache默认为Main Cache大小的80%,Probation Cache默认为Main Cache大小的20%。当然这些cache区域的大小会动态调整。

当有新的缓存项写入缓存时,会先写入Window Cache区域,当Window Cache空间满时,最旧的缓存项会被移出Window Cache。如果Probation Cache未满,从Window Cache移出的缓存项会直接写入Probation Cache;如果Probation Cache已满,则会根据TinyLFU算法确定从Window Cache移出的缓存项是丢弃(淘汰)还是写入Probation Cache。Probation Cache中的缓存项如果访问频率达到一定次数,会提升到Protected Cache;如果Protected Cache也满了,最旧的缓存项也会移出Protected Cache,然后根据TinyLFU算法确定是丢弃(淘汰)还是写入Probation Cache。

TinyLFU淘汰机制为:

从Window Cache或Protected Cache移出的缓存项称为Candidate,Probation Cache中最旧的缓存项称为Victim。如果Candidate缓存项的访问频率大于Victim缓存项的访问频率,则淘汰掉Victim。如果Candidate小于或等于Victim的频率,那么如果Candidate的频率小于5,则淘汰掉Candidate;否则,则在Candidate和Victim两者之中随机地淘汰一个。

从上面对W-TinyLFU的原理描述可知,caffeine综合了LFU和LRU的优势,将不同特性的缓存项存入不同的缓存区域,最近刚产生的缓存项进入Window区,不会被淘汰;访问频率高的缓存项进入Protected区,也不会淘汰;介于这两者之间的缓存项存在Probation区,当缓存空间满了时,Probation区的缓存项会根据访问频率判断是保留还是淘汰;通过这种机制,很好的平衡了访问频率和访问时间新鲜程度两个维度因素,尽量将新鲜的访问频率高的缓存项保留在缓存中。同时在维护缓存项访问频率时,引入计数器饱和和衰减机制,即节省了存储资源,也能较好的处理稀疏流量、短时超热点流量等传统LRU和LFU无法很好处理的场景。

个人总结:

名词解释:

LRU(Least Recent Use):是基于缓存项的最后访问时间(读或写)对缓存项进行排序,访问时间最早(也就是离当前时间最远,缓存项最旧)的缓存项最先被淘汰,最后访问时间离当前时间最近(least recent的含义)的缓存项被保留下来。

Window Cache:window缓存区,数据最先进入的区域,占cache总大小1%。

Main Cache:包含Protected Cache和Probation Cache

Protected Cache:保护区,存储访问频率高的缓存区,由Probation Cache区进入,占Main Cache总大小80%。

Probation Cache:观察区,存储Window Cache过来的数据,占Main Cache总大小20%。

算法流程图:

 优点:

最近刚产生的缓存项进入Window区,不会被淘汰;访问频率高的缓存项进入Protected区,也不会淘汰;通过这种机制,平衡了访问频率和访问时间新鲜程度两个维度因素,尽量将新鲜的和访问频率高的缓存项保留在缓存中。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Caffeine的官方文档包含了详细的API文档,可以帮助用户了解Caffeine的使用方法和功能。其中包括翻译后的API文档caffeine-2.8.0-javadoc-API文档-中文(简体)版.zip,用户可以通过该文档查阅相关的类和方法的说明。此外,用户还可以通过Maven坐标com.github.ben-manes.caffeine:caffeine:2.8.0来引入Caffeine的jar包。 官方文档中也提到了caffeine内部采用ConcurrentHashMap进行缓存数据,并且提供了Scheduler机制来定时清除淘汰缓存,同时还有Executor来执行异步查询任务并存入缓存。 用户可以通过官方文档来了解更多关于Caffeine的细节和使用方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [缓存性能之王caffeine使用文档](https://blog.csdn.net/lifan_zuishuai/article/details/122894838)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [caffeine-2.8.0-API文档-中文版.zip](https://download.csdn.net/download/qq_36462452/86089932)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值