【问题标题】:How can I migrate a RedisCacheManager with default expiration to Spring Data Redis 2.0?如何将默认过期的 RedisCacheManager 迁移到 Spring Data Redis 2.0?
【发布时间】:2018-09-14 06:09:47
【问题描述】:

我正在将一个使用 Spring Data Redis 的项目升级到 2.x。以前,可以使用RedisCacheManager.setDefaultExpiration(defaultExpireTime) 为缓存管理器配置默认过期时间。这个选项似乎在 2.x 中不存在。 2.x 中的等价物是什么?是RedisCacheConfiguration.entryTtl(ttl),还是别的什么?

我可能遗漏了一些东西,但我没有找到 Spring Data Redis 2.x 的迁移指南。有这样的迁移指南吗?

简而言之,我想将以下代码迁移到 Redis 2.x:

public CacheManager cacheManager() {
    RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
    redisCacheManager.setDefaultExpiration(DEFAULT_EXPIRATION_SECONDS);
    return redisCacheManager;
}

public RedisTemplate<String, Object> redisTemplate() {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory());
    return template;
}

以下是等价的吗?如果不是,Redis 2.x 中的等效代码是什么?

public CacheManager cacheManager() {
    return RedisCacheManager.builder(redisConnectionFactory())
            .cacheDefaults(RedisCacheConfiguration.defaultCacheConfig().entryTtl(DEFAULT_EXPIRATION_DURATION))
            .build();
}

【问题讨论】:

  • 是的,它是等价的

标签: spring redis spring-data spring-data-redis


【解决方案1】:

使用新的 redis 版本,您不能再传递 RedisTemplate。

这是您可以设置 RedisCacheManager 过期的方法(例如:1 小时过期)

@Bean
public RedisCacheManager redisCacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
    RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
            .disableCachingNullValues()
            .entryTtl(Duration.ofHours(1));

   return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(lettuceConnectionFactory)
                    .cacheDefaults(redisCacheConfiguration).build();

}

如果没有设置entryTtl,则没有过期。

用 spring redis 2.4.1 测试

PS:你也可以定义两个RedisCacheManager bean,一个带有@Primary 注解。这样你就可以像这样在@Cacheable/@CachePut注解中传递timeoutCacheManager。

@Cacheable(value = "your.cache.name", cacheManager = "timeoutCacheManager")

【讨论】:

    【解决方案2】:

    把这个放到application.yml中

    spring.cache.redis.time-to-live: 60s

    将 60 更改为您的 DEFAULT_EXPIRATION_SECONDS

    【讨论】:

      【解决方案3】:

      原来,我是在运行下面的源代码和依赖...

          @Bean(value ="redisTemplate")
      public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
          RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
          redisTemplate.setConnectionFactory(redisConnectionFactory);
          return redisTemplate;
      }
      
      @Bean
      public CacheManager cacheManager(RedisTemplate redisTemplate){
          RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
          cacheManager.setDefaultExpiration(resourceConfigValue.getCacheExpireSeconds());
          return cacheManager;
      }
      

      org.springframework.boot:spring-boot-starter-web:1.5.10.RELEASE

      org.springframework.boot:spring-boot-starter-data-redis:1.5.10.RELEASE

      我已经确认这个想法按预期工作......

          @Bean(value ="redisTemplate")
      public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
          RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
          redisTemplate.setConnectionFactory(redisConnectionFactory);
          return redisTemplate;
      }
      
      @Bean
      public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
          Duration expiration = Duration.ofSeconds(resourceConfigValue.getCacheExpireSeconds());
          return RedisCacheManager.builder(redisConnectionFactory)
                  .cacheDefaults(RedisCacheConfiguration.defaultCacheConfig().entryTtl(expiration)).build();
      }
      

      org.springframework.boot:spring-boot-starter-web:2.0.2.RELEASE

      org.springframework.boot:spring-boot-starter-data-redis:2.0.2.RELEASE

      【讨论】:

      • 你是怎么确认的?
      • 进行这些更改后,我运行了我的单元测试套件,其中包含大约 275 个单元和集成测试用例。这包括从我存储应用程序上下文的 Redis 服务器访问值,用于我的安全和用户对象。一切似乎都像以前一样工作,现在如果有新功能,我还没有时间深入研究 - 但谢谢你的例子,因为最近在主要版本中发生了所有变化,我没有看到文档更新,这篇文章帮助我继续前进。
      猜你喜欢
      • 2018-12-27
      • 1970-01-01
      • 2020-09-26
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2020-11-07
      • 2018-09-08
      相关资源
      最近更新 更多