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

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

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

一、缓存穿透

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

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

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

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

  • 最后只能告诉顾客没有

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

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

解决办法:

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

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


二、缓存击穿

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

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

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

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

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

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

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

解决办法:

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

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


三、缓存雪崩

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

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

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

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

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

  • 仓库门口排起了长队

常见场景:

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

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

解决办法:

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

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


总结:

  • 穿透:查不存在的数据

  • 击穿:热点 Key 过期

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

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

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

相关推荐
IT规划师3 小时前
Redis 数据类型全解 - Hash 还是 String + JSON?一文终结存储选型之争(三)
redis·.net core·哈希表·.net10
captain3767 小时前
MyBatis(入门5)其他查询操作
java·数据库·spring boot·mybatis
夕除8 小时前
Redis 过期策略
redis·笔记·面试
小此方8 小时前
Re:Mysql数据库基础篇(八):详细讲解复合查询、多表查询、自连接、多行、多列子查询与合并查询
数据库·mysql
xszivvvv8 小时前
Mariadb数据库frm文件异常,如何恢复数据
数据库·mariadb
smile_life_8 小时前
MySQL 设置 防止账户被暴力破解
数据库·mysql
ShineWinsu9 小时前
对于Qt:QRadioButton常见属性以及QButtonGroup的解析
数据库·c++·qt·microsoft·gui·qradiobutton·qbuttongroup
测试盐9 小时前
oracle数据库卡顿排查
数据库·oracle
滕州市燕猫虎计算机科技工作室个体工商户9 小时前
MySQL、MVCC、多版本并发控制
数据库·mysql·mvcc·数据库事务