如何将默认过期的 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?的主要内容,如果未能解决你的问题,请参考以下文章