Spring Boot集成Redis缓存时无法为记录设置过期时间问题咨询
排查步骤
1. 确认存储操作的API体系
Spring Data Redis的TTL配置分为两套独立体系,混用会直接导致配置不生效:
@RedisHash、@TimeToLive注解仅对RedisRepository/CrudRepository系列接口的存储操作生效,如果你是直接用RedisTemplate、StringRedisTemplate调用方法存数据,这两个注解不会被解析,自然不会设置过期时间。spring.cache.redis.time-to-live配置仅对**Spring Cache注解(@Cacheable/@CachePut/@CacheEvict)**的存储操作生效,如果你没有开启@EnableCaching注解、或者自定义了RedisCacheConfiguration覆盖了默认配置,配置文件的TTL参数会失效。
2. 排查常见操作失误
- 确认查询的key是实际存入Redis的key:用RedisRepository存Hash类型数据时,默认会给key拼接
@RedisHash的value值作为前缀,比如示例中GetPackages类如果没有指定@RedisHash的value,默认前缀是类名首字母小写,实际存储的key格式为getPackages:{实体类的id字段值},而非自定义的mykey,可先执行keys *确认实际存在的key再查TTL。 - 确认
@TimeToLive字段可被Spring读取:你用了@Data注解会自动生成getter/setter,如果你关闭了lombok的对应生成规则,需要手动给ttl字段添加public的getter方法,Spring读取不到ttl值会跳过过期设置。 - 确认Redis服务端支持过期设置:手动在redis-cli执行
EXPIRE 你的实际key 60,再执行TTL查询,如果返回值还是-1,说明Redis服务端禁用了EXPIRE命令,和Spring无关。 - 确认没有自定义RedisCacheConfiguration覆盖默认配置:如果你用Spring Cache体系,手动写了Redis缓存配置类但没有调用
entryTtl方法设置过期时间,配置文件中的spring.cache.redis.time-to-live会直接失效。
3. 通用解决方案
如果调整配置后依旧不生效,可直接在存储逻辑后手动添加过期时间设置,兼容性最高:
场景1:使用RedisTemplate存储
// 存储对象逻辑 redisTemplate.opsForValue().set("你的key", 你的对象); // 手动设置过期时间,单位可自定义 redisTemplate.expire("你的key", 120, TimeUnit.SECONDS);
场景2:使用Spring Cache存储
添加自定义缓存配置类,强制指定TTL:
@Configuration @EnableCaching public class RedisCacheConfig { @Bean public RedisCacheConfiguration redisCacheConfiguration() { return RedisCacheConfiguration.defaultCacheConfig() // 全局过期时间,单位秒,可按需调整 .entryTtl(Duration.ofSeconds(120)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); } }
内容的提问来源于stack exchange,提问作者Janusz Januszewski
相关产品推荐
相关产品推荐

