Yihui’s Blog

什么是缓存雪崩?如何解决?

日期:2026-09-27
标签:#面试 #场景设计 #Redis
难度:中等
来源:牛面场景题
答案说明:独立整理(站内题目标记为 VIP,未读取会员答案)

一句话答案

缓存雪崩是大量不同键在同一时间失效,或缓存服务大范围不可用,使请求集中回源;要分别治理集中到期和整层故障,并保护下游容量。

面试口语版(约 60 秒)

如果一批商品缓存用相同 TTL 同时写入,就可能一起过期;如果 Redis 集群不可用,也会让大量键同时失去缓存保护。这两种情况都可能让数据库承受超过平时的回源流量。对于集中到期,可按业务容忍度给 TTL 加抖动、分批预热或提前刷新;对于缓存层故障,要准备高可用、客户端超时、多级缓存或可接受的旧值兜底。无论哪种原因,数据库入口都需限制回源并发、排队长度和重试量,必要时限流、熔断和降级。恢复时分批预热,避免缓存刚恢复又被同时打满。判断方案有效与否,要看缓存故障演练期间数据库和接口能否保持在可控范围。

两类触发路径

触发典型例子主要处置
大量键集中到期批量导入后为所有键设置同样 TTLTTL 抖动、分批预热、提前刷新
缓存层大范围故障Redis 节点或网络不可用、连接池耗尽高可用切换、快速失败、多级缓存、下游保护

例如活动开始前一次性预热商品信息,若所有键在同一时刻过期,数据库连接池可能被回源请求占满。随机化到期时间能分散这类峰值,但不能解决 Redis 整层不可用;此时每个请求都可能回源,必须有请求预算和降级路径。若允许展示上一次商品描述,可短时使用本地旧值;库存、价格等关键决策应按各自一致性要求从权威来源获取或拒绝操作。

取舍与易错点

  • TTL 抖动的幅度要结合可接受陈旧时间与预热节奏设计,不能随意延长关键数据有效期。
  • 多级缓存减少 Redis 故障时的压力,但会增加失效和一致性复杂度。
  • 限流保护数据库,却会牺牲部分请求成功率;需要定义哪些接口优先保留。
  • 雪崩是大量键或整层缓存的问题;击穿通常是单个热点键失效。监控缓存错误率、未命中率、数据库连接池/查询并发、接口延迟和降级比例。

面试官递进追问

  1. 缓存雪崩与单热点键击穿有什么不同?
  2. TTL 加随机抖动能解决 Redis 集群整体故障吗?
  3. 缓存恢复后为什么还需要控制回填和预热速度?

自测

  • 不看笔记,60 秒分别说出集中到期和缓存故障的防护。
  • 为“Redis 完全不可用”画出回源限流与降级的请求路径。

参考资料

资料核对日期:2026-09-27。

维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

如何为Redis分布式锁设置合理的超时时间?

日期:2026-09-27 标签:#面试 #场景设计 #Redis 难度:中等 来源:牛面场景题 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 租约应覆盖可预期的执行、暂停与网络抖动,同时限制故障后的等待;没有可靠耗时上界时用有身份校验的受控续期,并在业务资源侧防止旧执行者写入。 面试…

阅读全文

怎么用Redis实现可重入的分布式锁?

日期:2026-09-27 标签:#面试 #场景设计 #Redis 难度:中等 来源:牛面场景题 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 为同一把锁保存“本次最外层获锁的唯一令牌 + 重入次数 + 租约”;嵌套调用共享该令牌并原子递增,释放时递减,次数归零才删除。新一轮独立获锁必…

阅读全文

基于 Redis 实现分布式锁有什么优缺点?

日期:2026-09-27 标签:#面试 #场景设计 #Redis 难度:简单 来源:牛面场景题 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 Redis 锁接入简单、响应快,适合容忍少量故障窗口内重复执行的任务;租约过期与主从切换可能破坏互斥,关键写入还须在资源侧拒绝旧持有者。 面试…

阅读全文