第2章:缓存穿透、击穿与雪崩面试问答

本章聚焦分布式缓存三类经典问题:穿透、击穿、雪崩。它们是面试高频区分点,考察对缓存原理、边界条件及工程应对的掌握程度。先通过一张回答框架图建立结构化思路。

面试问题 识别问题类型 缓存穿透 缓存击穿 缓存雪崩 分点回答原因 + 解决方案 补充实际优化经验 / 总结
回答框架提示:先判断题目具体指向哪类问题,再分别阐述成因和应对策略,最后结合项目落地细节(如布隆过滤器、互斥锁、过期时间随机化)给出差异化回答。避免只背概念,要体现调优思维。

面试问答卡片

面试问题:请详细说明缓存穿透、缓存击穿、缓存雪崩的区别及各自的解决方案。

面试官考察点:基础概念清晰度、边界场景识别能力、方案对比与适用性判断。

回答框架:

  1. 分别定义三种现象;
  2. 说明核心原因(穿透:查询不存在Key;击穿:热点Key到期瞬间;雪崩:大量Key同时过期或Redis宕机);
  3. 逐一给出解决方案,强调工程可落地性;
  4. 可选补充:如何权衡性能与一致性。

简短示例回答:“穿透指查询不存在的数据,方案:布隆过滤器+缓存空对象;击穿指热点Key失效,方案:互斥锁或逻辑过期;雪崩指大量Key同时过期,方案:过期时间加随机值、集群高可用、限流降级。实际项目中我使用布隆过滤器拦截空查询,对热点Key设置永不过期+后台更新。”

可能追问:布隆过滤器误判率如何控制?互斥锁的性能开销?如果Redis本身挂了怎么办?

避坑提醒:不要只说“加锁”而不谈锁的粒度与超时;不要混淆“缓存失效”与“Redis宕机”的雪崩;布隆过滤器要给出具体内存计算示例。
面试问题:Redis内存淘汰策略有哪些?如何选择?生产环境中如何保证数据一致性?

面试官考察点:对Redis内存管理的理解、淘汰策略适用场景、一致性与性能的平衡实战经验。

回答框架:

  1. 列举主要淘汰策略(LRU、LFU、TTL、随机、不淘汰);
  2. 根据业务场景说明选择逻辑(如热点数据用allkeys-lru,有时效性数据用volatile-ttl);
  3. 数据一致性部分:先更新数据库再删缓存(延时双删)或Binlog监听同步;
  4. 强调CAP权衡:强一致性用锁/事务,高可用用最终一致性。

简短示例回答:“我用allkeys-lru配合volatile-lfu双策略,热点数据自动淘汰低频。一致性采用‘更新DB后删缓存+延迟1秒再删一次’,配合MQ异步补偿,线上QPS 5万时缓存命中率99%。”

可能追问:LRU与LFU的区别?为什么先更新DB再删缓存?延时双删的时间如何设定?

避坑提醒:不要只说“删缓存”不提原子性问题;避免说“先删缓存后更新DB”这种低效方案;淘汰策略选择要结合Key过期设置。
面试问题:如何设计缓存Key和过期时间来避免热点Key导致的问题?

面试官考察点:缓存Key建模能力、热点流量预估与规避、动态调整意识。

回答框架:

  1. 良好Key命名规范(业务前缀+冒号+唯一标识);
  2. 热点Key识别:流量监控、本地缓存、哈希分片;
  3. 过期时间设计:基础过期+随机偏移(防雪崩)、大Key拆分;
  4. 动态冷热分离:常热点Key设置主动刷新。

简短示例回答:“比如商品详情Key:product:{id}:detail。热点Key通过Redis的hotkey分析工具定位,对它们设置永不淘汰+本地LFU缓存。过期时间设为基础值+0~60秒随机,避免批量失效。大Key则拆为多个字段hash存储。”

可能追问:如何用Redis的keystats命令?本地缓存一致性怎么保证?

避坑提醒:不要设计过长Key(超过128字节);避免过期时间过于固定;避免所有Key存入同一数据库槽导致倾斜。
本章小结:穿透、击穿、雪崩是必考题,三类问题既要区分清楚,又要给出完整方案。回答时使用“定义→原因→方案→补充经验”的结构,并带上具体数字(如QPS、缓存命中率)即可拉开差距。