Spring Boot如何从application.properties读取@RedisHash的timeToLive
从配置文件读取@RedisHash的timeToLive值的实现方式
首先明确:Spring Data Redis 2.1.0及以上版本中,@RedisHash注解的所有属性原生支持Spring属性占位符解析,不需要额外写绕路逻辑,直接替换硬编码值为占位符引用即可实现需求。你完全不需要像之前读取Redis host、port那样,单独用@Value把配置值读出来再往注解里塞——类级别注解的属性占位符解析,是由Spring容器的注解后置处理器在运行期自动完成的,和字段级别的@Value注入是两套独立的解析逻辑。
基础实现(适配新版本)
- 先在
application.properties中新增对应配置项,注意timeToLive的默认单位为秒,配置值需要和单位匹配:# 自定义UserModel的缓存过期时间,单位:秒 cache.user.model.ttl=1800 - 直接将注解中硬编码的TTL值替换为占位符表达式即可,示例代码:
// 替换前硬编码 // @RedisHash(value = "UserModel", timeToLive = 5) // 替换后从配置文件读取 @RedisHash(value = "UserModel", timeToLive = "${cache.user.model.ttl}")
常见踩坑提示
- 占位符对应的配置值必须为整数类型,不能写带小数点的数值,否则应用启动时会报类型转换失败错误
- 不要在占位符里写SpEL表达式,
@RedisHash的属性不支持SpEL解析,只能用标准的${}属性占位符语法
低版本兼容方案(Spring Data Redis <2.1.0)
老版本的注解解析逻辑没有内置占位符支持,直接写${}不会生效,这个时候需要通过自定义RedisKeyValueAdapter接管TTL的计算逻辑,绕开注解硬编码的限制:
- 自定义Redis配置类,从配置文件读取对应实体的TTL值,注入到自定义的适配器中:
@Configuration public class CustomRedisConfiguration { @Value("${cache.user.model.ttl}") private long userModelTtl; @Bean public RedisKeyValueAdapter redisKeyValueAdapter(RedisOperations<String, String> redisOperations) { // 实例化适配器,覆盖默认的TTL读取逻辑 RedisKeyValueAdapter adapter = new RedisKeyValueAdapter(redisOperations); // 为指定的Redis Hash命名空间配置从配置文件读取的过期时间 adapter.setTimeToLive("UserModel", userModelTtl, TimeUnit.SECONDS); return adapter; } } - 这种方式下甚至可以直接删掉
@RedisHash注解里的timeToLive属性,自定义适配器的规则优先级高于注解上的硬编码值,灵活度更高,还支持按业务场景动态调整不同哈希的过期时间。
内容的提问来源于stack exchange,提问作者Yusuf T.
相关产品推荐
相关产品推荐

