caffeine框架 W-TinyLFU算法详解

参考链接:

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

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

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

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

caffeine框架 W-TinyLFU算法详解_第1张图片

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%。

算法流程图:

caffeine框架 W-TinyLFU算法详解_第2张图片

 优点:

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

你可能感兴趣的:(jvm,java框架,缓存,java,jvm缓存)