ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

缓存穿透、雪崩、击穿三连问,能答全的没有几个

缓存穿透、雪崩、击穿三连问,能答全的没有几个 面试后端岗位缓存三兄弟几乎是必考题。但奇怪的是能准确说出三者区别的人寥寥无几。很多人背了答案却依然在线上踩坑。今天我们就用三个连环问把这层窗户纸彻底捅破。第一问什么是缓存穿透你该怎么防缓存穿透指的是查询一个数据库里根本不存在的数据。因为不存在所以缓存永远不会命中每次请求都打到数据库。如果有人恶意用不存在的ID高频攻击数据库压力瞬间飙升。典型场景用户查询id-1的商品缓存里没有数据库也没有。正常逻辑是查不到就不写缓存于是每次请求都穿透到DB。解决方案有三招第一缓存空值。查不到也写个null进Redis设个短过期时间比如60秒。这样后续同样请求直接命中空值不会打到DB。第二布隆过滤器。把所有可能存在的key提前放进布隆过滤器请求先过过滤器不存在直接返回。优点是内存占用小缺点是有误判率且删除困难。第三参数校验。在入口层就拦截非法请求比如ID必须为正整数、长度固定。这招最基础但最容易被忽略。第二问什么是缓存雪崩和穿透有什么区别缓存雪崩指的是大量缓存同时失效导致所有请求瞬间涌向数据库。注意穿透是查不存在的数据雪崩是查存在的数据但缓存集体过期了。常见原因系统启动时批量加载缓存设置了相同的过期时间或者Redis集群宕机整个缓存层不可用。解决方案第一过期时间加随机值。比如基础过期时间30分钟再加个0到5分钟的随机偏移避免同一时刻集体失效。第二多级缓存。本地缓存Caffeine Redis即使Redis挂了本地还能扛一阵。第三熔断降级。当数据库压力过大时直接返回兜底数据或友好提示别让DB崩掉。第四Redis高可用。主从哨兵或集群模式避免单点故障。第三问什么是缓存击穿它和雪崩又差在哪缓存击穿指的是某个热点key突然失效大量请求同时涌向数据库。注意是一个key不是大批key。比如秒杀商品缓存刚好过期瞬间几千请求打到DB。雪崩是“大面积失效”击穿是“单点失效”。击穿往往发生在高并发场景下破坏力极强。解决方案第一互斥锁。只让一个线程去查DB并重建缓存其他线程等待。可以用Redis的SETNX实现分布式锁或者用本地锁。伪代码java复制下载if (缓存不存在) { if (获取锁成功) { 查DB写缓存释放锁 } else { 休眠50ms重试 } }第二热点数据永不过期。逻辑过期后台异步更新。但实现复杂适合极端热点。第三提前预热。秒杀开始前手动把热点key加载进缓存并设置较长过期时间。三连问总结一张表分清三者问题核心特征数据是否存在影响范围核心解法穿透查不存在的数据不存在单key高频空值缓存、布隆过滤器雪崩大量key同时失效存在大面积随机过期、多级缓存、熔断击穿热点key失效存在单key高并发互斥锁、永不过期、预热最后一句缓存三兄弟本质都是请求绕过缓存直接打到数据库。区别在于触发条件和影响范围。面试时能说清区别工作中能选对方案才算真正掌握了。下次再被问到别只背定义把场景和取舍讲出来你就赢了大多数人。
返回列表