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

时间:2018-04-04 15:35:34

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

我正在升级使用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();
}

3 个答案:

答案 0 :(得分:5)

最初,我正在运行以下源代码和依赖项......

    @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:弹簧引导起动的web:1.5.10.RELEASE

org.springframework.boot:弹簧引导起动数据的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:弹簧引导起动数据的Redis:2.0.2.RELEASE

答案 1 :(得分:0)

将其放入application.yml

spring.cache.redis。生存时间:60秒

将60更改为您的DEFAULT_EXPIRATION_SECONDS

答案 2 :(得分:0)

使用新的 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")