Spring Boot 3.x+Redisson二级缓存:如何配置Redis端TTL实现离线清理
问题解决:Spring Boot 3.x + Redisson二级缓存,Redis端自动过期配置
问题背景
使用Spring Boot 3.x搭配Redis与Redisson作为二级缓存,应用运行时功能正常,但停止后缓存条目因Redisson仅在客户端处理过期而永久留存。已在application.yml中配置TTL,但Redis端未设置TTL,需实现Redis端自动清理缓存(含哈希中单个条目),同时通过唯一hibernate.cache.region_prefix适配实体向后不兼容变更。
解决方案
可以通过调整Redisson配置,强制让Redis端管理缓存条目过期(包括哈希类型缓存的单个字段),无需依赖客户端定时任务。具体步骤如下:
1. 开启Redisson Redis原生过期支持
在application.yml的Hibernate配置中添加use_redis_expiration: true,让Redisson在存储缓存时直接在Redis端设置TTL:
spring: jpa: properties: hibernate: cache: use_second_level_cache: true region_prefix: ${DEPLOYMENT_ID:l2_cache} # 动态前缀,每个部署设唯一值 region: factory_class: org.redisson.hibernate.RedissonRegionFactory redisson: entity: expiration: time_to_live: 20000 max_idle_time: 20000 fallback: true config: redisson.yml use_redis_expiration: true # 开启Redis端过期管理
2. 配置Redisson缓存区域的条目TTL
在redisson.yml中针对目标缓存区域(格式为region_prefix.region_name)配置单个哈希条目的过期时间,对应Redis的HEXPIRE操作:
# Redisson连接配置示例(根据实际环境调整) singleServerConfig: address: "redis://localhost:6379" password: "" database: 0 # 缓存区域配置 cacheConfigs: "${DEPLOYMENT_ID:l2_cache}.someEntityCache": # 对应实体的region名+前缀 entryTTL: 20000 # 哈希中每个实体条目的过期时间(毫秒) maxIdleTime: 20000 useRedisKeyspaceNotifications: false # 关闭客户端通知监听,完全依赖Redis原生过期
3. 验证配置效果
应用重启并缓存实体后,通过Redis命令验证:
- 查看哈希缓存的字段:
HGETALL l2_cache.someEntityCache - 检查单个哈希条目的过期状态:可通过Redis客户端查看字段的过期属性,或使用
HEXPIRE l2_cache.someEntityCache <实体ID> --check命令验证
关键说明
- Redis端过期:开启
use_redis_expiration后,Redisson会在存储每条缓存数据时,自动调用Redis的EXPIRE(普通键)或HEXPIRE(哈希字段)设置过期时间,应用停服后Redis会自动清理过期条目。 - 部署隔离:通过
${DEPLOYMENT_ID:l2_cache}动态设置region_prefix,每个部署使用唯一前缀,彻底避免实体结构变更导致的缓存脏数据问题。
内容的提问来源于stack exchange,提问作者BartoszMiller
相关产品推荐
相关产品推荐

