Redis 缓存穿透、缓存击穿、缓存雪崩

今天我们一起来聊聊 Redis 缓存的三大经典问题,缓存穿透、缓存击穿、缓存雪崩。

缓存是系统的第一道防线,但它有三种典型的 "失守" 场景------穿透、击穿、雪崩。

一、缓存穿透

**定义:**查询一个根本不存在的数据,缓存里没有,数据库里也没有,每次请求都直接打到数据库。

想象你开了一家奶茶店,顾客来问:"老板,有狗屎咖啡味的珍珠奶茶吗?" 这种奇葩口味你根本没进过货,于是:

  • 顾客问 → 你翻菜单(查缓存)→ 没有

  • 你跑去仓库看(查数据库)→ 也没有

  • 最后只能告诉顾客没有

如果有成千上万个顾客都来问这个不存在的口味,你就得跑上万次仓库,累都累死了。

**常见场景:**黑客攻击,用随机 ID 疯狂请求不存在的数据,直接把数据库拖垮。我们公司最近就遇到了类似的情况------攻击者找到了部分场景的漏洞,把一些付费功能里的余额都消耗掉了。周一上班客户一反馈,整个团队都懵了,马上紧急修复。

解决办法:

  • 缓存空值:查不到的也在缓存里记一笔"没有",下次直接返回

  • 布隆过滤器(Bloom Filter):在请求进入缓存前先拦截,不存在的直接挡掉


二、缓存击穿

**定义:**一个超级热门的商品(热点 Key),缓存突然过期了,瞬间大量请求同时打到数据库。

双十一零点,店里的爆款奶茶"芝士奶盖茶"限时秒杀,库存只有 100 杯。

  • 原本大家都从菜单(缓存)看价格和库存

  • 突然,一条狗把菜单叼走了(缓存过期)

  • 几千个顾客同时大喊:"老板!这款多少钱!还有吗!"

  • 你只能一次次跑去仓库(查数据库)确认,瞬间被问懵了

穿透和击穿的区别:穿透是查不存在的,击穿是查存在的但缓存刚好过期。

解决办法:

  • 加互斥锁:缓存失效时,只让一个请求去查数据库并重建缓存,其他请求等待

  • 热点数据永不过期:对极热的 key 不设过期时间,后台异步更新


三、缓存雪崩

**定义:**大量缓存同时失效,导致整个系统的请求像雪崩一样涌向数据库。

你开了家超市,店里所有商品的价格标签(缓存)都在同一天被人撕了。

  • 早上一开门,几百个顾客同时进店

  • 每个人问不同的商品价格

  • 你没有任何标签可看,只能一个个跑去仓库查

  • 仓库门口排起了长队

常见场景:

  • 所有缓存设置了相同的过期时间,比如都在凌晨 3 点过期

  • Redis 集群突然宕机,所有缓存瞬间不可用

解决办法:

  • 设置随机过期时间:给每个 key 的过期时间加一个随机偏移,避免同时失效

  • 搭建缓存集群:主从 + 哨兵,避免单点故障导致整体不可用


总结:

  • 穿透:查不存在的数据

  • 击穿:热点 Key 过期

  • 雪崩:大量缓存同时失效

AI 发展太迅猛了。不管是生活中,还是工作中,皆可用到 AI。AI 编程现在也特别牛逼,Trae、Qoder、Cursor、Claude 等等。大部分时候用用免费的,遇到刁钻的问题时,就用用付费的。给钱给出的答案,还是比免费的要好不少的。自掏腰包还是有点遭不住,有公司支持那就又不一样了。

毁掉一个人最快的方式,只需要给他足够的安逸。-- 烟沙九洲

相关推荐
一只积极向上的小咸鱼1 小时前
第一性原理思考:从拆解问题到用实验检验答案
数据库
这个DBA有点耶2 小时前
时序数据库InfluxDB高基数问题深度拆解:内存索引膨胀机制与OOM完整链路
数据库·架构·dba
加油yx2 小时前
MySQL数据类型
数据库·mysql
行百里er3 小时前
Redis 模块——JSON、向量搜索与时序
redis·后端
蓝胖的四次元口袋3 小时前
Redis知识梳理(1)
数据库·redis·缓存
夜雪一千3 小时前
MySQL 数据加密实战:从传输、存储到字段级加密,分清场景不踩坑
数据库·mysql
wefg13 小时前
【Redis】C++ 自定义客户端
数据库·redis·缓存
这个DBA有点耶4 小时前
为什么UPDATE比SELECT危险得多?锁范围等于扫描行数
数据库·架构·代码规范
天国梦4 小时前
国密门禁品牌怎么选?2026年最新3个避坑要点
运维·服务器·数据库·python
DB哥讲数据库4 小时前
【达梦数据库安装教程】超详细图文讲解-附达梦安装包
数据库·oracle