我在我的应用中使用了 Spring boot 1.5.15 。我使用 Redis 作为缓存服务器添加了缓存支持,并使用Spring Caching批注来处理缓存操作。
使用Spring Caching和Redis,无法为我使用的每个缓存提供单独的到期时间。
因此,我如下自定义了CacheManager bean,并创建了一个配置类,以获取yaml文件中我使用的各个缓存的过期值。
@Bean
@RefreshScope
public CacheManager cacheManager() {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
cacheManager.setUsePrefix(true);
List<CacheConfig> cacheConfigList = appConfig.getCacheConfig();
if (null != cacheConfigList && cacheConfigList.size() > 0) {
cacheManager.setExpires(getCacheExpirySecondsMap(cacheConfigList));
}
return cacheManager;
}
public Map<String, Long> getCacheExpirySecondsMap(List<CacheConfig> cacheConfigList) {
Map<String, Long> cacheConfigMap = cacheConfigList.stream()
.collect(Collectors.toMap(x -> x.getName(), x -> x.getExpirySeconds()));
return cacheConfigMap;
}
我的CacheConfig bean具有以下字段,
String name;
Long expirySeconds;
我的AppConfig具有以下字段,
List<CacheConfig> cacheConfig;
通过yaml,我得到如下值,
app:
defaultCacheExpiryTime: 10
cache-config:
- name: members
expiry-seconds: 60
- name: users
expiry-seconds: 70
- name: plans
expiry-seconds: 85
这很好。但是,现在我需要在运行时动态更改缓存的过期值,而无需循环服务。
我尝试将 @RefreshScope 添加到Cache Manager bean中,并在Config Repo中外部化配置,并由Spring Cloud Config Server提供服务。但是,当我调用 actuator / refresh 端点时,我没有看到 CacheManager Bean刷新。但是,我确实看到CacheConfig bean已使用值更新。另外,我看到对/ refresh的响应包括其过期值已更改的更新字段。
基本上,我想用新的到期时间更新 RedisCacheManager Bean,以便将它们应用于不同缓存的所有现有的以及新的缓存键。另外,我正在使用 Spring Cloud Edgware.SR4 。
我已经共享了我在仓库中使用的代码,包括配置服务器,配置仓库和存储库https://github.com/quickfox123/cachedemos中的缓存服务
如果有人知道如何解决该问题,请帮助我。