详解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. 接口层做限流、降级、熔断

相关推荐
devmoon15 分钟前
在 Polkadot Runtime 中添加多个 Pallet 实例实战指南
java·开发语言·数据库·web3·区块链·波卡
认真的薛薛25 分钟前
数据库-sql语句
数据库·sql·oracle
爱学英语的程序员35 分钟前
面试官:你了解过哪些数据库?
java·数据库·spring boot·sql·mysql·mybatis
消失的旧时光-19431 小时前
第十四课 · 实战篇:Redis 缓存系统落地指南(Spring Boot 从 0 到可用)
spring boot·redis·缓存
·云扬·2 小时前
MySQL Redo Log落盘机制深度解析
数据库·mysql
用户982863025682 小时前
pg内核实现细节
数据库
飞升不如收破烂~2 小时前
Redis 分布式锁+接口幂等性使用+当下流行的限流方案「落地实操」+用户连续点击两下按钮的解决方案自用总结
数据库·redis·分布式
森焱森2 小时前
详解 Spring Boot、Flask、Nginx、Redis、MySQL 的关系与协作
spring boot·redis·python·nginx·flask
workflower2 小时前
业务需求-假设场景
java·数据库·测试用例·集成测试·需求分析·模块测试·软件需求
池央2 小时前
CANN Catlass 算子模板库深度解析:GEMM 核心优化、模板元编程与片上缓存策略的协同
缓存