Caffeine 本地缓存框架原理及用法总结-阿里云开发者社区

开发者社区> 5abyqn7wigzqm> 正文

Caffeine 本地缓存框架原理及用法总结

简介: Caffeine 本地缓存框架原理及用法总结
+关注继续查看

常用缓存算法:
First in first out(FIFO)队列:先进先出,最先进入的数据最先被淘汰,缺点:忽略数据访问频率和访问次数。
Least recently used (LRU):最近最少使用算法,即:如果数据最近被访问过,那么将来被访问的概率也更大。LRU使用一个链表来实现,新插入的数据会被添加到链表的头部;当缓存命中后,就会再将数据移动到链表的头部;如果链表满的时候,就会将链表尾部的数据丢弃。
【命中率】如果存在热点数据,LRU的效率很好,然而对于偶发性的、周期性的批量操作就会导致LRU命中率急剧下降,缓存污染情况比较严重。
【复杂度】实现简单。
【代价】访问数据命中时需要遍历链表,并找到命中的数据块索引位置,然后再将数据移动到链表头部。

LRU.png

Least frequently used (LFU):最近经常使用算法,即:如果数据过去被访问多次,那么将来被访问的频率也更高。

Caffeine缓存算法:它结合了LRU和LFU两种算法来管理缓存。

Caffeine数据结构:
Caffeine采用的是readBuffer和writeBuffer。它使用一个Long数组来存储key的访问频率。Long的64位被分为4个段,每个段占16位。首先,根据key算出hash值,使用hash值来计算处于4段中哪个段;其次,计算出4个段的具体位置,并设定当前位置的频率;最终以这4个频率值的最小值来代表该key的访问频率。
ringbuffer默认为16,其数组大小是256,假设引用大小为4字节(ringbuffer中存储的是引用),缓存行大小为64。所以这里每个缓存行只存一个数据,所以cas操作追加16,即数组中每16个元素只有一个有效存储,以空间换时间。

高性能读写操作:
借鉴数据库的WAL思想,读写操作后,将操作记录(判断数据是否过期;统计频率;记录读写统计命中率等)记载到缓冲区,再异步处理,提高了性能。
WAL(Write-Ahead Logging)的核心思想是:在数据写入到数据库之前,先写入到日志.再将日志记录变更到存储器中。

Caffeine缓存的三种回收策略
基于大小(size-based):maximumSize
基于时间(time-based):

     expireAfterAccess 最后一次访问过期计时
     expireAfterWrite  最后一次写入时过期计时

基于引用(reference-based):仅对软引用、弱引用过期处理

使用方法:

// 初始化Caffeine对象
@Bean
public Cache<String, Object> caffeineCacheInstance() {
Cache<String, Object> caffeineCache = Caffeine.newBuilder().initialCapacity(initialCapacity)
// 设置永不过期,默认300年
.expireAfterAccess(Long.MAX_VALUE, TimeUnit.DAYS)
.expireAfterWrite(Long.MAX_VALUE, TimeUnit.DAYS)
// 设置移除监听器
.removalListener(new CacheRemoveListener())
// 不限容量
//.maximumSize(maximumSize)
.build();
return caffeineCache;
}
// 增加处理缓存移除监听器类CacheRemoveListener
public class CacheRemoveListener implements RemovalListener<Object, Object> {
@Override
public void onRemoval(@Nullable Object key, @Nullable Object value, @Null RemovalCause cause) {
// 缓存被回收或过期时处理
if(cause.equals(RemovalCause.COLLECTED) || cause.equals(RemovalCause.EXPIRED)) {
// 当对象被回收或过期时需要处理
return;
}
// 缓存更新时处理
if(cause.equals(RemovalCause.REPLACED)) {
logger.warn("Caffeine " + cause + " OK, key-value, " + key + ":" + value);
}
}
}

用法:在具体的@Service类中引用
@Autowired
private Cache<String, Object> caffeineCacheInstance;
存放:caffeineCacheInstance.put(key, value);
读取:Object value = caffeineCacheInstance.getIfPresent(key);

使用时需要注意点:
(1)初始化本地缓存数据
(2)容量评估,不要超出内存容量
(3)缓存命中率
(4)垃圾回收
(5)性能测试

相关名词解释:
驱逐(eviction):由于满足了某种驱逐策略,后台自动进行的删除操作
无效(invalidation):表示由调用方手动删除缓存
移除(removal):监听驱逐或无效操作的监听器

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9485 0
DL框架之AutoKeras框架:深度学习框架AutoKeras框架的简介、特点、安装、使用方法详细攻略
DL框架之AutoKeras框架:深度学习框架AutoKeras框架的简介、特点、安装、使用方法详细攻略
24 0
Spring MVCD框架中调用HanLP分词的方法
项目简要:关于java web的一个项目,用的Spring MVCd 框架。鉴于参与此次项目的人中并不是所人都做的Spring,为了能够提高效率,建议大家是先抛开SPring来写自己负责的模块,最后再把各个模块在Spring里面集成。
639 0
【JavaScript框架封装】使用Prototype给Array,String,Function对象的方法扩充
版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81055991 ...
971 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13167 0
TF之AutoML框架:AutoML框架的简介、特点、使用方法详细攻略
TF之AutoML框架:AutoML框架的简介、特点、使用方法详细攻略
20 0
不使用任何框架,手写纯 JavaScript 实现上传本地文件到 ABAP 服务器
不使用任何框架,手写纯 JavaScript 实现上传本地文件到 ABAP 服务器
12 0
34
文章
1479
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载