ehcache3多级缓存应用
项目中如果有使用大量的本地缓存场景,可以使用redis+ehcache组合缓存,优先使用ehcache本地缓存,本地缓存没有查询到再使用redis缓存
(图片来源网络,侵删)
可看前文中如何集成
本地缓存使用存在的问题
1、本地缓存如何保证缓存的是最新值
可定义版本号、自增id或者时间戳,进行判断比对是否是最新值
2、各个节点保证本地缓存一致性
保证各个节点的一致性,且不影响性能,常使用消息进行发布订阅或者是广播模式进行同步
public class CustomerCache implements org.springframework.cache.Cache {
void evict(Object key);
void put(Object key, @Nullable Object value);
T get(Object key, Callable valueLoader);
}
针对以上3个主要方法,
PUT
void put(Object key, @Nullable Object value){
// 数据都得保存一份到redis
boolean success = redis.put(key, expire, value);
// 存入版本号
redis.put(newKey, expire, remoteVersion);
// 以上2步骤应开启redis事务,或可存入hset格式
Long remoteVersion = getRemoteVersion(key);
if (success) {
// 存入本地缓存
ehCacheClient.put(cacheName, prefix + key, remoteVersion);
ehCacheClient.put(cacheName, key, value);
// 发出消息,message需包含key remoteVersion,操作类型,put或delete
messageService.send(topic, message);
// 注册消息监听
messageService.registerMessageListener(message -> {
//删除缓存
if (operate == delete) {
ehCacheClient.remove(cacheName, key);
ehCacheClient.remove(cacheName, prefix + key);
return;
}
// 更新缓存
Long localVersion = ehCacheClient.get(cacheName, prefix + key);
if (remoteVersion > localVersion) {
ehCacheClient.put(cacheName, key, remoteValue);
ehCacheClient.put(cacheName, prefix + key, remoteVersion);
}
});
}
}
GET
T get(Object key, Callable valueLoader){
value = (T) ehCacheClient.get(cacheName, key)
if (value == null) {
value = redis.get(key);
// 重新增加本地缓存
ehCacheClient.put(cacheName, key, value);
ehCacheClient.put(cacheName, prefix + key, value);
}
}
EVICT
void evict(Object key){
ehCacheClient.remove(cacheName, key);
ehCacheClient.remove(cacheName, prefix + key);
redis.remote(key);
// 同步到其他节点
messageService.send(topic, message);
}
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
