第4章 缓存设计与Redis面试实战

缓存是抵御高并发压力的第一道防线,也是面试中区分"会用Redis"和"懂缓存体系"的核心分水岭。本章围绕穿透/击穿/雪崩、分布式锁、集群选型三个高频板块展开,每道题都配有回答框架、示例话术和追问预判,帮你在面试中呈现出"实战型架构视野"。

本章知识结构

核心主题 面试考点 推荐方案 避坑要点
缓存穿透 / 击穿 / 雪崩 异常场景识别、分层防御策略 布隆过滤器 + 互斥锁 + 过期随机化 不可只答理论;空值缓存需区分业务语义
Redis 分布式锁 Redisson 原理、RedLock 缺陷、CAP 权衡 SETNX + 看门狗 / RedLock 奇数节点 禁止 SETNX+EXPIRE 两条命令;注意 GC 停顿影响
Redis 集群模式 Cluster 槽位分配、选型对比、扩缩容 Redis Cluster 3主3从 + hash tag 跨节点事务受限;hash tag 需防数据倾斜
缓存策略与一致性 旁路缓存、延迟双删、最终一致性 Cache Aside + 异步对账 更新顺序:先写 DB 再删缓存;避免并发脏读
复习建议:先掌握知识结构表格中的四类考点,再通过问答卡片深化细节,最后用项目案例串联完整方案。

核心考点图解:缓存问题诊断与解决路径

面试官常让你"从现象讲到底层方案",下图展示从问题识别到技术选型的标准回答路径:

缓存问题诊断路径 缓存穿透 缓存击穿 缓存雪崩 布隆+空值缓存 互斥锁+永不过期 过期随机+多级缓存
面试加分点:回答时先说"三种问题的核心区别在于请求是否真实存在、key是否为热点、失效范围是否集中",再逐个给出对应方案,最后用项目数据佐证效果。

面试问答卡片

Q1:请详细讲解缓存穿透、缓存击穿、缓存雪崩的区别及你的项目解决方案。

🎯 面试官考察点
· 是否准确理解三种异常的本质区别(请求是否存在 / key是否热点 / 失效是否集中)
· 有没有真实项目经验,方案是否考虑过资源开销和边界情况
· 能否给出可落地的分层防御架构,而非堆砌术语

📐 回答框架

  1. 定义对比:一句话说清每个问题的核心特征
  2. 原因分析:从请求流和数据分布两个角度解释成因
  3. 分层方案:按"入口→缓存→存储"三层给出具体技术选型
  4. 项目印证:举一个你实际解决的案例,带上数据指标
✏️ 示例回答:穿透是查询不存在数据,我用布隆过滤器拦截非法key并缓存空值(短TTL)。击穿是热点key失效,采用互斥锁 + 永不过期 + 异步更新。雪崩是大规模key同时过期,将TTL加随机值分散失效,并引入Caffeine本地缓存兜底。三管齐下后,缓存命中率从70%恢复至99.2%。

🔍 可能追问

  • 布隆过滤器的误判率如何估算?容量和哈希函数数量怎么定?
  • 空值缓存会导致内存泄漏吗?你是如何清理的?
  • 互斥锁在超高并发下对性能有多大影响?有没有无锁方案?
  • 本地缓存与Redis缓存的数据一致性怎么保证?
⚠️ 避坑提醒:① 不要只背定义,必须结合项目谈"你做了什么";② 布隆过滤器不支持删除,需定期重建,面试时要主动说明;③ 空值缓存要区分"业务空结果"和"异常空结果",避免掩盖真实问题。

Q2:Redis分布式锁是如何实现的?RedLock算法的原理和局限性是什么?

🎯 面试官考察点
· 是否真正理解分布式锁的本质(互斥、安全、高可用)
· 对Redisson源码的熟悉程度,以及能否辩证评价RedLock
· 在CAP权衡中做选择的依据

📐 回答框架

  1. 基础实现:SETNX + 过期时间 + Lua脚本保证原子性
  2. Redisson增强:看门狗自动续期、可重入、信号量
  3. RedLock原理:在3/5个奇数节点获取多数锁,容忍少数节点故障
  4. 局限性:GC暂停可能打破安全性;性能开销较大;时钟跳跃问题
✏️ 示例回答:项目中基于Redisson实现,用SETNX + 过期时间 + 看门狗自动续期。在秒杀库存扣减场景,使用RLock等待3秒、锁超时30秒,保证同一用户同一商品只有一个请求操作库存。RedLock在3个奇数节点获取多数锁,可容忍1节点故障,但GC暂停时所有锁可能同时失效,我们通过缩短GC停顿和监控补偿来缓解。

🔍 可能追问

  • RedLock在Full GC时为什么可能失效?你能画个时间线解释吗?
  • 你们项目为什么选Redisson而不是自己写?遇到过什么坑?
  • 如果要求强一致性(CP),你会换用ZooKeeper吗?为什么?
  • 锁超时时间怎么设置?业务执行时间超过锁超时怎么办?
⚠️ 避坑提醒:① 不要用 SETNX + EXPIRE 两条命令,必须用 Lua 或 SET 的 NX/EX 选项;② RedLock 不是银弹,在CP场景下优先考虑 ZooKeeper;③ 锁超时时间应根据业务 p99 耗时设置,并配合看门狗动态续期,避免死锁或锁提前释放。

Q3:你们为什么选择Redis Cluster?数据分片如何实现?与Codis、主从+Sentinel相比的优势?

🎯 面试官考察点
· 对 Redis 集群演进路线和各自原理的掌握程度
· 选型时是否考虑过运维复杂度、扩展性、事务支持等维度
· 对 Cluster 槽位迁移、resharding 等运维细节是否了解

📐 回答框架

  1. 选型理由:无中心化、原生支持分片、社区活跃
  2. 分片原理:16384个槽位,CRC16(key) & 16383 计算槽位
  3. 对比优势:vs Codis — 无中心化,运维简单;vs 主从+Sentinel — 天然水平扩展
  4. 项目实践:3主3从架构,使用hash tag路由关联数据,支持在线扩缩容
✏️ 示例回答:选择Redis Cluster因为无中心化,16384个槽位通过CRC16哈希分布,支持在线水平扩展。相比Codis运维简单,相比主从+Sentinel天然支持分片。我们使用hash tag将用户维度数据路由到同一节点,支持批量操作。3主3从架构,主节点故障自动failover,大促期间扩从节点提升读能力。

🔍 可能追问

  • 槽位迁移过程中对读写请求有什么影响?客户端如何处理MOVED和ASK?
  • Cluster模式下事务和Lua脚本有什么限制?你是如何绕过的?
  • hash tag使用不当会导致数据倾斜,你们怎么监控和避免?
  • 集群规模超过100节点时,gossip协议有什么问题?怎么优化?
⚠️ 避坑提醒:① Cluster 模式下不支持跨节点事务和 Lua 脚本操作多 key,必须用 hash tag 将这些 key 路由到同一节点;② hash tag 不能滥用,避免所有 key 都使用相同 tag 导致数据倾斜;③ 不要忽略 MOVED 和 ASK 重定向的处理逻辑,面试中能说出细节是加分项。

项目案例:电商平台缓存体系重构

缓存体系重构 STAR S 电商高并发 缓存命中率暴跌 T 重构缓存体系 破穿透击穿雪崩 A 布隆+本地缓存 +Redis Cluster+红锁 R 命中率99.5% 可用性99.99%
项目名称 电商平台缓存体系重构
业务背景 日活3000万,大促期间缓存命中率从95%骤降至70%,数据库CPU持续100%,多次出现雪崩预警。核心链路包括商品详情、秒杀库存、推荐页。
规模指标 日活 3000万 | QPS峰值 10万 | 缓存key 5亿+ | Redis集群 50台物理机 (256G内存) | 日请求量 80亿
技术栈 缓存层:Redis Cluster 6.2.7 + Redisson 3.17 + Caffeine 本地缓存
防御层:Guava BloomFilter (误判率1%) + 空值缓存 (TTL 30s)
监控层:Prometheus + Grafana + 自定义Redis Exporter
一致性:Cache Aside + 延迟双删 + 异步对账
核心难点
  • 热点key击穿:秒杀商品详情页QPS 3万,单key失效直接打穿DB
  • 刷子流量穿透:恶意遍历不存在的SKU ID,每天拦截超2亿次无效请求
  • 全品类促销雪崩:大促时大量key在同一时间窗口过期,DB连接池瞬间耗尽
  • 分布式锁可靠性:库存扣减要求不能超卖,锁超时和GC停顿导致锁失效
面试高频追问