怎样在Spring Cache中配置Redis过期随机数防雪崩_自定义TTL生成器

秋枫酱_1162

秋枫酱_1162

2026-06-20

191人浏览

原创

@cacheable不支持ttl配置,因spring cache抽象层无此字段;需通过rediscacheconfiguration分cachename设基础ttl,并用randomizedttlcachewriter在put时加±10%随机偏移。

怎样在spring cache中配置redis过期随机数防雪崩_自定义ttl生成器

为什么直接在@Cacheable里加随机TTL会编译失败

因为 @Cacheable 注解压根没有 ttl、timeToLive 或任何类似字段——Spring Cache抽象层不支持单次调用动态设TTL。你写 @Cacheable(timeToLive = 60),IDE会直接报错:*Unknown property*。这不是配置漏了,是API根本不存在。

用RedisCacheConfiguration按cacheName分组配TTL+随机偏移

真正可控的方式,是在构建每个 RedisCacheManager 时,对不同缓存名(如 "user"、"product")分别配置基础TTL,并在运行时加随机扰动。关键不是“覆盖注解”,而是接管缓存写入前的 RedisCacheWriter。

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

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

下载
  • 定义一个 RandomizedTtlCacheWriter,包装原始 RedisCacheWriter,在 put() 时对传入的 Duration 做 ±10% 随机浮动
  • 每个 CacheManager 绑定独立的 RedisCacheConfiguration,其中 entryTtl 设为基础值(比如 Duration.ofMinutes(30))
  • 确保 cacheDefaults 显式设置,否则新 cache 实例会 fallback 到全局默认配置,随机逻辑就失效了
  • 别依赖 set(K,V,Duration) ——它底层走 SETEX,无法复用已存在 key;要用 set() + expire() 两步,才能对已有 key 动态改 TTL

自定义@CacheTTL注解 + AOP拦截实现方法级TTL扰动

如果你坚持用 @Cacheable 声明式风格,又想每个方法能带自己的基础TTL和随机范围,就得自己造轮子:定义 @CacheTTL 注解,再用 AOP 在 @Cacheable 执行前注入随机化逻辑。

  • @CacheTTL(value = 1800, jitter = 300) 表示基础 30 分钟,±5 分钟随机波动
  • AOP 切点监听 @Cacheable 方法执行,从注解提取 jitter,生成 Duration 后塞进上下文或 ThreadLocal
  • 配合自定义 RedisCacheWriter,在写入时读取该 Duration 并应用随机偏移
  • 注意:AOP 不会自动作用于内部调用(private / this. 调用),且需确保切面顺序早于 Spring Cache 拦截器

Redis端防雪崩的硬性提醒:别只靠Java层随机

Java 层加随机只是第一道防线。Redis 自身的过期清理机制才是最终保障——它靠“惰性删除 + 定期采样”双策略,但默认每秒只扫 10 次,每次最多检查 20 个键。如果大量 key 的 TTL 被设成同一整点(比如都设 EXPIREAT 1716742800),那一秒内 Redis 可能突然被过期扫描压垮。

  • 务必在业务写入时用 redisTemplate.expire(key, randomSeconds, TimeUnit.SECONDS),而不是统一算好时间戳再用 expireAt()
  • 监控 expired_keys 指标(redis-cli INFO stats | grep expired_keys),如果该值长期为 0 或突增 10 倍,说明随机没生效或采样力度不够
  • 高并发场景下,hz 参数建议从默认 10 调到 5~8,避免定时任务抢 CPU;active-expire-effort 可设为 2,平衡清理力度与性能
随机不是加个 new Random().nextInt(60) 就完事。它必须贯穿从注解解析、缓存写入、Redis命令下发到服务端过期调度的全链路,任一环节断掉,雪崩风险照旧。

相关专题

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

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

2025.08.06

2411

22

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

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

2026.01.26

437

25

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

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

2023.11.02

4349

19

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

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

2023.11.14

3855

11

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

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

2024.04.02

7032

6

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

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

2024.04.07

623

6

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

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

2024.04.07

756

6

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

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

2024.04.07

6722

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1160

6

热门下载

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

精品课程

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

共0课时 | 0人学习