详解redis(15):缓存雪崩

通常我们为了保证缓存中的数据与数据库中的数据一致性,会给 Redis 里的数据设置过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,业务系统需要重新生成缓存,因此就会访问数据库,并将数据更新到 Redis 里,这样后续请求都可以直接命中缓存。

那么,当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机 时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩的问题。

一、缓存雪崩是怎么发生的?

大量缓存同一时间过期

Redis 整体不可用

比如:

Redis 宕机

Redis 集群网络故障

主从切换失败

二、缓存雪崩的完整过程

  1. 用户请求 /order/detail?id=123

  2. 发现 Redis key 过期

  3. 线程访问 MySQL

  4. 同一时间 1w 个请求都这么干

  5. MySQL 连接池耗尽

  6. 接口 RT 飙升

  7. 服务雪崩(线程阻塞)
    真正压垮系统的不是"缓存失效",而是"并发放大"

缓存雪崩的缺点

数据库 CPU 100%

连接池打满

服务线程阻塞

上游服务超时

整个系统级联故障

三、如何解决缓存雪崩?

不要让请求同时落到数据库

一、缓存层解决方案

过期时间"错峰"设置

热点数据永不过期

Redis 不设置 TTL

value 里带 expireTime

后台线程异步更新

前台永远有旧数据兜底

多级缓存

Redis 挂了:

本地缓存还能扛一部分流量

二、数据库保护措施

服务限流 & 降级

QPS 超限 → 直接返回兜底数据

保护数据库不被打死

熔断机制

DB RT 超过阈值

直接切断访问

三、架构层解决方案

Redis 高可用

主从 + Sentine

Redis Cluster

防的是 "整体不可用"型雪崩

提前预热缓存

服务启动

定时任务

热点数据先加载

一个标准的"抗雪崩方案"

  1. 缓存过期时间加随机值,避免同时失效

  2. 热点数据采用逻辑过期,异步更新

  3. 使用多级缓存减少 Redis 依赖

  4. Redis 集群 + Sentinel 保证高可用

  5. 接口层做限流、降级、熔断

相关推荐
wu8587734571 分钟前
向量数据库不是银弹:从枚举漏检到 ReACT 多轮召回的实践路径
前端·数据库·react.js
hsg7736 分钟前
简述:Jensen Huang‘s Footsteps网站全内容分析
前端·javascript·数据库
yuezhilangniao37 分钟前
MySQL 8.0.32 二进制安装脚本 和初始化 操作系统版本rocky86
数据库·mysql·adb
Trouvaille ~1 小时前
【Redis篇】Redis 主从复制:数据同步的原理与实现
数据库·redis·缓存·中间件·高可用·主从复制·后端开发
真实的菜1 小时前
Redis 从入门到精通(五):哨兵模式(Sentinel)—— 自动故障转移的完整原理与实战
数据库·redis·sentinel
Solis程序员1 小时前
缓存三剑客预防策略
java·spring·缓存
是小王同学啊~1 小时前
Redis 面试通关笔记:高频八股 + 生产实战 + 追问链路(下)
redis·面试题
唔661 小时前
(二)补充完整的数据库、中间件、MQTT、JAR后台和Web前端的部署脚本,全部一键自动化。
数据库·中间件·jar
六月雨滴1 小时前
Oracle 内存优化
数据库·oracle
学代码的真由酱2 小时前
MySQL数据库进阶-数据库设计实践-Java
数据库·mysql·数据库设计