Redis 缓存穿透、击穿、雪崩,我花了 3 年才分清它们的区别

Redis 缓存穿透、击穿、雪崩,我花了 3 年才分清它们的区别
面试时被问到Redis 缓存穿透、击穿、雪崩有什么区别我支支吾吾答不上来。工作三年后终于在实际项目中把这三个概念搞清楚了。不是我不爱学习是这三个名字太像了网上很多文章也讲混了。我用自己的踩坑经历帮你彻底分清。缓存穿透查询一个不存在的数据场景用户查询一个数据库里根本没有的 key比如 id-1 的商品。问题每次查询都会穿透缓存直接打到数据库。如果恶意攻击者构造大量不存在的 key数据库会扛不住。我的踩坑早期项目没做校验有人用脚本批量请求不存在的商品 ID数据库 CPU 飙到 90%。解决方案布隆过滤器或者缓存空值设置较短的过期时间比如 5 分钟。缓存击穿一个热点 key 过期了场景某个 key 访问量极高比如首页的商品列表。这个 key 过期的一瞬间大量请求同时打到数据库。问题不是查询不存在的数据是查询存在的数据但缓存刚好失效。我的踩坑双十一活动页缓存设置了 10 分钟过期。过期那一刻数据库直接挂了。解决方案互斥锁只有一个线程去查数据库其他线程等待或者逻辑过期不设置 TTL用逻辑时间判断。缓存雪崩大量 key 同时过期场景缓存重启、或者批量设置了相同的过期时间导致大量 key 在同一时间失效。问题和击穿类似但规模更大。不是单个 key是成片 key 同时失效。我的踩坑项目上线时为了预热缓存一次性加载了 10 万个 key全部设置了 1 小时过期。1 小时后数据库被瞬间打爆。解决方案过期时间加随机偏移比如 1 小时 ± 10 分钟或者多级缓存本地缓存 Redis。一句话总结穿透查不存在的数据恶意攻击击穿热点 key 刚好过期瞬时高并发雪崩大量 key 同时过期系统性风险面试时的回答技巧不要背定义讲场景。面试官想听的是你在什么情况下遇到过怎么解决的。我现在的回答结构是场景描述 → 问题现象 → 解决方案 → 后续预防。你们在实际项目中遇到过哪种我查了下很多公司的缓存策略其实是混着用的没有严格区分这三种情况。是不是只有大厂才会精细化处理