当前位置: 首页 > 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);}

相关文章:

  • 简单介绍QKeySequenceEdit的使用
  • 【开源】渔具租赁系统 JAVA+Vue.js+SpringBoot+MySQL
  • MySQL -- SQL笔试题相关
  • 考试题库:华为HCIA-Datacom易错题⑪(含答案解析)
  • 数据处理随机采样前提条件
  • 算法-扫描线
  • 护网红线不能碰,网络安全人员其实也不安全,人才是最大的风险
  • Oracle Hint /*+APPEND*/插入性能总结
  • 在PostGIS中检查孤线(Find isolated lines in PostGIS)
  • 使用PNP管控制MCU是否需要复位
  • Bytebase 2.18.0 - 支持创建用户组
  • 公众号爆文全攻略:最新推荐机制与实战干货分享
  • java-类和对象
  • HBSL-22Q/K定时限过电流继电器 板前接线 JOSEF约瑟
  • 单实例11.2.0.3迁移到RAC11.2.0.4_使用RMAN 异机恢复
  • 10个确保微服务与容器安全的最佳实践
  • 2017届校招提前批面试回顾
  • 345-反转字符串中的元音字母
  • Hibernate最全面试题
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript DOM 10 - 滚动
  • Java的Interrupt与线程中断
  • JS+CSS实现数字滚动
  • Laravel Telescope:优雅的应用调试工具
  • node 版本过低
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Shadow DOM 内部构造及如何构建独立组件
  • socket.io+express实现聊天室的思考(三)
  • Vue 重置组件到初始状态
  • vuex 笔记整理
  • 大主子表关联的性能优化方法
  • 翻译--Thinking in React
  • 分布式熔断降级平台aegis
  • 浮现式设计
  • 判断客户端类型,Android,iOS,PC
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 算法-插入排序
  • 我与Jetbrains的这些年
  • ​补​充​经​纬​恒​润​一​面​
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (4)事件处理——(7)简单事件(Simple events)
  • (6)STL算法之转换
  • (二)Optional
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十一)c52学习之旅-动态数码管
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)一些感悟
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .dwp和.webpart的区别
  • .net core + vue 搭建前后端分离的框架