今天我们一起来聊聊 Redis 缓存的三大经典问题,缓存穿透、缓存击穿、缓存雪崩。
缓存是系统的第一道防线,但它有三种典型的 "失守" 场景------穿透、击穿、雪崩。
一、缓存穿透
**定义:**查询一个根本不存在的数据,缓存里没有,数据库里也没有,每次请求都直接打到数据库。
想象你开了一家奶茶店,顾客来问:"老板,有狗屎咖啡味的珍珠奶茶吗?" 这种奇葩口味你根本没进过货,于是:
-
顾客问 → 你翻菜单(查缓存)→ 没有
-
你跑去仓库看(查数据库)→ 也没有
-
最后只能告诉顾客没有
如果有成千上万个顾客都来问这个不存在的口味,你就得跑上万次仓库,累都累死了。
**常见场景:**黑客攻击,用随机 ID 疯狂请求不存在的数据,直接把数据库拖垮。我们公司最近就遇到了类似的情况------攻击者找到了部分场景的漏洞,把一些付费功能里的余额都消耗掉了。周一上班客户一反馈,整个团队都懵了,马上紧急修复。
解决办法:
-
缓存空值:查不到的也在缓存里记一笔"没有",下次直接返回
-
布隆过滤器(Bloom Filter):在请求进入缓存前先拦截,不存在的直接挡掉
二、缓存击穿
**定义:**一个超级热门的商品(热点 Key),缓存突然过期了,瞬间大量请求同时打到数据库。
双十一零点,店里的爆款奶茶"芝士奶盖茶"限时秒杀,库存只有 100 杯。
-
原本大家都从菜单(缓存)看价格和库存
-
突然,一条狗把菜单叼走了(缓存过期)
-
几千个顾客同时大喊:"老板!这款多少钱!还有吗!"
-
你只能一次次跑去仓库(查数据库)确认,瞬间被问懵了
穿透和击穿的区别:穿透是查不存在的,击穿是查存在的但缓存刚好过期。
解决办法:
-
加互斥锁:缓存失效时,只让一个请求去查数据库并重建缓存,其他请求等待
-
热点数据永不过期:对极热的 key 不设过期时间,后台异步更新
三、缓存雪崩
**定义:**大量缓存同时失效,导致整个系统的请求像雪崩一样涌向数据库。
你开了家超市,店里所有商品的价格标签(缓存)都在同一天被人撕了。
-
早上一开门,几百个顾客同时进店
-
每个人问不同的商品价格
-
你没有任何标签可看,只能一个个跑去仓库查
-
仓库门口排起了长队
常见场景:
-
所有缓存设置了相同的过期时间,比如都在凌晨 3 点过期
-
Redis 集群突然宕机,所有缓存瞬间不可用
解决办法:
-
设置随机过期时间:给每个 key 的过期时间加一个随机偏移,避免同时失效
-
搭建缓存集群:主从 + 哨兵,避免单点故障导致整体不可用
总结:
-
穿透:查不存在的数据
-
击穿:热点 Key 过期
-
雪崩:大量缓存同时失效
AI 发展太迅猛了。不管是生活中,还是工作中,皆可用到 AI。AI 编程现在也特别牛逼,Trae、Qoder、Cursor、Claude 等等。大部分时候用用免费的,遇到刁钻的问题时,就用用付费的。给钱给出的答案,还是比免费的要好不少的。自掏腰包还是有点遭不住,有公司支持那就又不一样了。
毁掉一个人最快的方式,只需要给他足够的安逸。-- 烟沙九洲