Redis缓存雪崩会导致读写性能下降吗?如何优化?

云墨小哥_5443

云墨小哥_5443

2026-07-21

762人浏览

原创

会,缓存雪崩会导致读写均急剧变慢,因数据库连接池耗尽、写操作依赖读逻辑卡住、cpu/io过载及orm缓存降级形成负向循环;加随机ttl需注意偏移量范围、固定key偏移、服务端时间;双层缓存需支持脏读与监控;redis故障时写操作应走异步补偿或降级直写db。

redis缓存雪崩会导致读写性能下降吗?如何优化?

会,而且下降得非常剧烈——不是“略有影响”,而是数据库在几秒内被压垮,读写延迟从几毫秒飙到数秒甚至超时,写操作也可能因连接池耗尽而阻塞或失败。

缓存雪崩为什么让读写都变慢

缓存雪崩不是只影响“读”,它会通过连锁反应拖垮整个数据链路:

  • 读请求失效后涌向数据库,瞬间占满数据库连接池,新来的读、写请求都拿不到连接,wait_timeout 或 max_connections 耗尽是常见现象
  • 写操作常依赖读(比如先查再更新),查不到缓存 → 查库 → 查库慢 → 写逻辑卡住 → 写入延迟上升甚至超时
  • 数据库 CPU/IO 拉满后,自身 WAL 写入、事务提交、索引维护等后台动作也变慢,进一步恶化所有 SQL 的执行时间
  • 如果用了 ORM(如 MyBatis、Hibernate),一级/二级缓存可能因数据库响应慢而失效或降级,形成负向循环

加随机 TTL 是最简单但最容易翻车的操作

很多人直接套用 ttl + new Random().nextInt(300),但没注意几个关键点:

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

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

下载
  • 随机范围不能太小:比如基础 TTL 是 30 分钟,只加 ±30 秒,对高并发场景毫无意义;建议偏移量至少占基础 TTL 的 10%~30%,例如 1800 + rand.Intn(540)(30±9 分钟)
  • 不能在每次 set 时都重新生成随机值:如果一个 key 多次刷新缓存,每次 TTL 都不同,会导致过期时间混乱,反而更难预测失效节奏;应固定该 key 的随机偏移(比如用 key 的 hash 值取模)
  • 注意客户端时钟漂移:如果业务部署在多个时区或 NTP 不稳的机器上,System.currentTimeMillis() 可能偏差几百毫秒,影响实际过期分布,优先用 Redis 服务端时间(TIME 命令或 Lua 脚本中 redis.call('PEXPIREAT', ...))

本地缓存 + Redis 双层结构真能扛住雪崩吗

能,但前提是设计得当——很多项目加了 Caffeine 就以为万事大吉,结果雪崩时本地缓存照样被击穿:

  • 本地缓存必须允许“脏读”:即缓存过期后不立即淘汰,而是设为 refreshAfterWrite 模式,后台异步加载新值,前台继续返回旧值(需业务接受短暂不一致)
  • 不能只靠 maximumSize 和 expireAfterWrite:这俩只是被动淘汰策略,对突发流量无缓冲作用;必须配合 recordStats() + 监控 miss rate,一旦 cache.get(key) 的 missCount 短时飙升,就要触发告警或自动降级
  • 本地缓存的 key 命名要和 Redis 对齐,避免同一条数据在两层缓存里存成不同 key,导致预热失效或双写不一致
  • 注意 JVM 堆压力:Caffeine 默认用软引用+弱引用管理 entry,但在高并发下可能引发频繁 GC,建议显式配置 weigher 控制单条数据内存占用

Redis 故障时,写操作到底该阻塞还是丢弃

没有银弹,取决于业务语义。但可以明确的是:盲目重试或无限等待一定会让问题更糟。

  • 写前校验缓存可用性不现实:每次 SET 前都 PING Redis,会引入额外 RTT,且 PING 通 ≠ 服务可写(比如主从同步中断、OOM 时拒绝写入)
  • 推荐做法是结合 try-with-resources + RedisCallback 封装写操作,在 catch 到 RedisConnectionFailureException 或 JedisConnectionException 后,走 fallback 流程:记录日志 + 发送 MQ 消息 + 返回 success(异步补偿)
  • 对强一致性写(如扣库存),必须启用降级开关:比如配置中心下发 redis.write.enabled=false,此时写操作转为直写 DB,并标记“待补缓存”,等 Redis 恢复后由定时任务批量回填
  • 绝对不要在写失败时 sleep 后重试:这会把瞬时故障变成线程池阻塞,ThreadPoolExecutor 的 queue 填满后,新请求直接被 reject,比数据库慢更致命

真正容易被忽略的点是:缓存雪崩从来不是单一组件的问题,它是缓存策略、数据库容量、应用线程模型、监控告警响应速度共同决定的临界点。一个 EXPIRE 参数改错,可能要靠熔断阈值、连接池大小、GC 参数三者联动才能兜住——别只盯着 Redis 看。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.11.02

4489

19

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

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

2023.11.14

4035

11

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

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

2024.04.02

7472

6

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

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

2024.04.07

643

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

7342

6

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

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

2024.04.07

1160

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1096

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6438

6

热门下载

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

精品课程

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

共0课时 | 0人学习