当前位置: 首页 > news >正文

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> T get(Object key, Callable<T> valueLoader);
}

针对以上3个主要方法,

PUT
void put(Object key, @Nullable Object value){// 数据都得保存一份到redisboolean 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或deletemessageService.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> T get(Object key, Callable<T> 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);}
http://www.lryc.cn/news/361703.html

相关文章:

  • C# WinForm —— 24 Threading.Timer 组件介绍与使用
  • 03-07Java自动化之JAVA基础之循环
  • 【人工智能Ⅱ】实验8:生成对抗网络
  • vmware将物理机|虚拟机转化为vmware虚机
  • redis 高可用及哨兵模式 @by_TWJ
  • 封装tab栏,tab切换可刷新页面
  • JavaScript第八讲:日期,Math,自定义对象
  • php质量工具系列之phploc
  • 创建模拟器
  • 【Java】接口详解
  • 去掉el-table表头右侧类名是gutter,width=17px的空白区域(包括表头样式及表格奇偶行样式和表格自动滚动)
  • 3079. 求出加密整数的和
  • 奶茶店、女装店、餐饮店是高危创业方向,原因如下:
  • 嵌入式笔试面试刷题(day16)
  • 【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
  • [Zer0pts2020]easy strcmp 分析与加法
  • 力扣7. 整数反转
  • Mac/Linux getline 无法读取文件内容(读取内容无法显示)
  • NBM 算法【python,算法,机器学习】
  • spark3.0.1版本查询Hbase数据库例子
  • android高效读图方式——Hardwarebuffer读图
  • 悉数六大设计原则
  • hdfs复习
  • css-Ant-Menu 导航菜单更改为左侧列表行选中
  • 02-CSS3基本样式
  • USART串口外设
  • 大模型应用之基于Langchain的测试用例生成
  • C++之map
  • 【量算分析工具-方位角】GeoServer改造Springboot番外系列六
  • 【机器学习】机器学习与大模型在人工智能领域的融合应用与性能优化新探索