使用Spring Boot Actuator刷新端点在运行时刷新Spring Redis Cache Manager Bean

时间:2018-08-10 18:31:33

标签: spring-boot redis spring-cloud spring-boot-actuator spring-cloud-config

我在我的应用中使用了 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中的缓存服务

如果有人知道如何解决该问题,请帮助我。

0 个答案:

没有答案
相关问题