讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Spring Boot中实现Redis注解缓存的动态TTL过期策略

风瑶酱_3570

风瑶酱_3570

发布时间:2026-09-10 06:07:17

|

555人浏览过

|

来源于php中文网

原创

@Cacheable无法直接设置动态TTL,因其过期时间由启动时固定的RedisCacheConfiguration.entryTtl决定,不支持运行时计算;unless、condition等属性不影响TTL,且注解本身无timeToLive等动态参数。

如何在spring boot中实现redis注解缓存的动态ttl过期策略

为什么 @Cacheable 无法直接设置动态 TTL

@Cacheable 注解本身不接受运行时计算的过期时间参数,它的缓存行为由 RedisCacheManager 统一管控。你写 @Cacheable(value = "user", key = "#id"),实际生效的 TTL 完全取决于该 cache 名对应的 RedisCacheConfiguration.entryTtl() 配置 —— 这个值在应用启动时就固化了,后续调用不会变。

常见错误现象包括:在方法里改了 entryTtl 属性但没重建 CacheManager;或误以为 unlesscondition 能影响过期逻辑;甚至给 @Cacheable 加上自定义注解试图“拦截续期”,结果根本进不到缓存读写链路里。

根本原因在于 Spring Cache 是声明式抽象层,get() / put() 操作被封装在 RedisCache 内部,它只做一次性的 SET/SETEX,不触发 GETEX 或 PTTL+EXPIRE 组合。

用 RedisCacheManager 为不同 cache 设置固定但差异化的 TTL

这是最轻量、最稳定的方案,适合“按业务域划分缓存生命周期”的场景,比如 user 缓存 10 分钟、config 缓存 24 小时。

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 不要复用默认的 RedisCacheManager,而是手动构建:用 RedisCacheConfiguration 为每个 cache 名单独配 entryTtl
  • 配置方式推荐两种:
    – 在 Java Config 中用 Map<string rediscacheconfiguration></string> 显式注册各 cache;
    – 或使用 Spring Boot 3.2+ 的 TtlRedisCacheManager(继承自 RedisCacheManager),覆盖 createRedisCache() 方法,根据 cacheName 动态返回不同 RedisCacheConfiguration
  • 注意:修改配置后必须重启应用才生效;热更新需配合 @RefreshScope + 配置中心,但 CacheManager 本身不支持运行时刷新

想实现“读取即续期”,必须绕开 @Cacheable

Spring Cache 原生不支持访问时刷新 TTL,所谓“自动续期”只能自己动手。核心是放弃 @Cacheable,改用 RedisTemplate 手动控制读写流程。

关键点:

  • 不能用 opsForValue().set(key, value, timeout, unit) —— 它等价于 SETEX,会覆盖原有 key,丢失结构(比如你存的是 HASH,它会把你整个干成 STRING
  • 续期必须原子:先 GET,再判断存在,再 EXPIRE。否则并发读可能多次续期或漏续
  • 推荐用 Lua 脚本保证原子性:
    local val = redis.call("GET", KEYS[1])\nif val then\n redis.call("EXPIRE", KEYS[1], ARGV[1])\nend\nreturn val
  • 执行时传入 key 和新 TTL 秒数,返回原值 —— 这就是你要的“带续期的 get”

别踩这些坑:TTL 设置与 Redis 命令行为强相关

很多问题不是代码写错,而是对 Redis 底层命令语义理解偏差导致的。

  • SET key val EX 300EXPIRE key 300 效果一致,但前者只在 key 不存在时设过期;后者无论 key 是否存在都重置 TTL
  • SETGETSETDEL 会清除已有过期时间;而 INCRHSETLPUSH 不会 —— 所以如果你用 opsForHash().put() 更新一个已设 TTL 的 hash,TTL 依然有效
  • PERSIST 命令会彻底移除过期时间,变成永久 key;线上误用可能导致内存持续增长
  • Redis 的惰性删除机制意味着:key 过期后不访问就不会被删,TTL 返回 -2 表示 key 不存在,-1 表示存在但没设 TTL —— 监控时得区分这两种状态

真正难的不是写几行代码续期,而是把 Key 当工程对象来设计:命名统一、TTL 有据可依、结构与命令匹配。否则就算加了 Lua 脚本,也会因为 key 类型混乱或覆盖误操作让续期失效。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2111

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

397

2026.01.26

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4009

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3495

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6192

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

583

2024.04.07

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

696

2024.04.07

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

5582

2024.04.07

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

0

2026.09.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn