我在我的应用程序中使用 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 添加到缓存管理器bean,并将配置外部化为Config Repo并由Spring Cloud Config Server提供服务 . 但是,当我调用 actuator /refresh endpoints 时,我没有看到 CacheManager bean刷新 . 但是,我确实看到使用值更新了CacheConfig bean . 此外,我看到对/ refresh的响应包括已更改到期值的更新字段 .

基本上,我想用新的Expiration时间更新 RedisCacheManager Bean,以便它们将应用于不同缓存的所有现有缓存键和新缓存键 . 另外,我正在使用 Spring Cloud Edgware.SR4 .

我已经共享了我在repo中使用的代码,包括配置服务器,配置repo和存储库中的缓存服务,https://github.com/quickfox123/cachedemos

如果有人知道如何解决这个问题,请帮助我 .