使用 Spring Boot Actuator 刷新端点在运行时刷新 Spring Redis 缓存管理器 Bean

jus*_*ser 5 redis spring-boot 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;
    }
Run Code Online (Sandbox Code Playgroud)

我的 CacheConfig bean 有以下字段,

String name;
Long expirySeconds;
Run Code Online (Sandbox Code Playgroud)

我的 AppConfig 有以下字段,

List<CacheConfig> cacheConfig;
Run Code Online (Sandbox Code Playgroud)

通过 yaml 我得到如下值,

app:
  defaultCacheExpiryTime: 10
  cache-config:
  - name: members                 
    expiry-seconds: 60            
  - name: users
    expiry-seconds: 70
  - name: plans
    expiry-seconds: 85   
Run Code Online (Sandbox Code Playgroud)

这很好用。但是,现在我需要在运行时动态更改缓存的到期值而不循环服务。

我尝试将@RefreshScope添加到缓存管理器 bean,并将配置外部化到 Config Repo 中并由 Spring Cloud Config Server 提供服务。但是,当我调用执行器/刷新端点时,我没有看到CacheManager bean 被刷新。但是,我确实看到 CacheConfig bean 已使用这些值进行了更新。另外,我看到对 /refresh 的响应包括过期值已更改的更新字段。

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

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

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