如何将默认过期的 RedisCacheManager 迁移到 Spring Data Redis 2.0?

Posted

技术标签:

【中文标题】如何将默认过期的 RedisCacheManager 迁移到 Spring Data Redis 2.0?【英文标题】:How can I migrate a RedisCacheManager with default expiration to 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();

【问题讨论】:

是的,它是等价的 【参考方案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 服务器访问值,用于我的安全和用户对象。一切似乎都像以前一样工作,现在如果有新功能,我还没有时间深入研究 - 但谢谢你的例子,因为最近在主要版本中发生了所有变化,我没有看到文档更新,这篇文章帮助我继续前进。

以上是关于如何将默认过期的 RedisCacheManager 迁移到 Spring Data Redis 2.0?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Azure 事件网格发布覆盖默认过期时间到队列?

如何设置cookie的过期时间

java网站中session 有默认的过期时间吗?

如何严格设置php中session过期时间

怎么创建linux账户90天后过期

Redis的过期删除策略