ehcache3多级缓存应用

项目中如果有使用大量的本地缓存场景,可以使用redis+ehcache组合缓存,优先使用ehcache本地缓存,本地缓存没有查询到再使用redis缓存

可看前文中如何集成

本地缓存使用存在的问题

1、本地缓存如何保证缓存的是最新值

可定义版本号、自增id或者时间戳,进行判断比对是否是最新值

2、各个节点保证本地缓存一致性

保证各个节点的一致性,且不影响性能,常使用消息进行发布订阅或者是广播模式进行同步

c 复制代码
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
c 复制代码
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
c 复制代码
<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
c 复制代码
void evict(Object key){
	
	ehCacheClient.remove(cacheName, key);
	ehCacheClient.remove(cacheName, prefix + key);
	redis.remote(key);
	// 同步到其他节点	
	messageService.send(topic, message);

}
相关推荐
CoderYanger3 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
CQU_JIAKE6 小时前
11.7[高体】
java·后端·spring
计算机毕设定制辅导-无忧学长13 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
FungLeo14 小时前
成为全栈·基础补充·缓存的层次与失效:浏览器、CDN、服务端、数据库
缓存·cdn·数据一致性·http缓存·成为全栈·flutter缓存
小郎君65820 小时前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·spring cloud
code2cat20 小时前
【随笔】KV缓存量化:省下的显存,要付出多少数值误差
人工智能·缓存·大语言模型
csdn_aspnet20 小时前
Redis 入门:Windows、Mac安装指南
数据库·windows·redis·缓存·mac
jktantan1 天前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
Pniubi1 天前
缓存击穿的解决方案
缓存
露天赏雪1 天前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel