有关做能源的网站,空间安装wordpress,wordpress+one+page,17zwd一起做网店项目中如果有使用大量的本地缓存场景#xff0c;可以使用redisehcache组合缓存#xff0c;优先使用ehcache本地缓存#xff0c;本地缓存没有查询到再使用redis缓存 可看前文中如何集成 本地缓存使用存在的问题
1、本地缓存如何保证缓存的是最新值 可定义版本号、自增id或者… 项目中如果有使用大量的本地缓存场景可以使用redisehcache组合缓存优先使用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, CallableT 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, CallableT 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);}