缓存同步,应该是针对集群缓存环境下,对某缓存进行修改或删除后,集群内其他服务也应该同步该缓存修改,不然便会出现由缓存数据的不一致性导致服务出现的响应数据不一致。
JetCache默认不提供缓存同步 https://github.com/alibaba/jetcache/issues/260 而在 https://github.com/alibaba/jetcache/issues/303 中JetCache作者指明了应当如何进行扩展。
此处缓存同步是指在多级缓存(本地+远程...)环境中的本地缓存。而远程缓存同步一般是通过redis机制或其他远程缓存服务自带集群机制解决。
com.alicp.jetcache.Cache的结构如图
其中com.alicp.jetcache.MultiLevelCache 代表的便是多级Cache(CacheType.BOTH)。对于定义为CacheType.LOCAL 的Cache的改动,默认认为是该服务本地的,不会影响集群的缓存。而CacheType.REMOTE则认为其一致性由远端缓存服务提供。
而CacheType.BOTH 的生成在
com.alicp.jetcache.anno.support.CacheContext::buildCache(CachedAnnoConfig cachedAnnoConfig, String area, String cacheName) : Cache;
在jetcache中,对cache的操作都会触发事件CacheEvent,事件通过CacheMonitor进行消费。因此对多级缓存的同步事件捕获方式扩展如下:
/** 配置类 */
@Configuration
@AutoConfigureBefore(JetCacheAutoConfiguration.class)// 需在JetCacheAutoConfiguration前将SpringConfigProvider进行注册
public class CacheAutoConfiguration {
@Bean
public SpringConfigProvider springConfigProvider(ExRemoteCacheMonitorChains cacheMonitor) {
return new SpringConfigProvider() {
@Override
public CacheContext newContext(GlobalCacheConfig globalCacheConfig) {
return new CacheContextWrapper(globalCacheConfig, super.newContext(globalCacheConfig), cacheMonitor);
}
};
}
}
/** CacheContext 包装类 */
public cl