讲一次你设计的缓存架构,踩过什么坑?
后端开发第 4 / 13 题答题框架
参考思路:结构(旁路缓存)→一致性策略(延迟双删/订阅 binlog)→穿透/击穿/雪崩的应对。真实事故比理论加分。
五个经典回答示范
回答一 · 校招应届版
我先用旁路缓存结构讲:读请求先查缓存,未命中回源 DB 并回填;写请求更新 DB 再删缓存。三大经典问题按方案说:穿透用空值缓存或布隆过滤器、击穿用互斥锁或热点不过期、雪崩用过期时间加随机打散和多级缓存。我在实习项目里给热点配置加了本地缓存,QPS 扛住了三倍增长。
回答二 · 1-3年经验版
我踩过的最深坑是一致性:先更新 DB 后删缓存,删除失败导致脏读很久。改造方案:删除失败进重试队列,关键场景用订阅 binlog 的异步删除替代业务代码里删,业务与缓存解耦。另一次是缓存雪崩——一批 key 同一时刻过期,教训是 TTL 必须加随机抖动,并且容量规划按失效后回源峰值算。
回答三 · 资深版
缓存架构我按数据特征分类设计:读多写少做旁路缓存,写多场景先写缓冲合并,热点 key 做多级缓存与分片,大 value 考虑拆分或压缩。一致性上讲清各方案的窗口期:延迟双删、binlog 订阅、版本号,按业务容忍度选。最后是可观测性:命中率、回源 QPS、大 key 慢查询三个核心指标进大盘。
回答四 · 追问应对
追问『为什么是删缓存不是更新缓存』:并发写时更新缓存可能乱序覆盖,删除让下次读回源,语义简单可靠;『先删缓存再更新 DB 行不行』:不行,删后读请求会把旧值重新填回;『Redis 挂了怎么办』:熔断降级直连 DB 限流保护 + 集群高可用,缓存是加速层不是 correctness 层。
回答五 · 反面示范
『缓存就是加个 Redis,查不到就查库,更新的时候把缓存也 update 一下,保持同步就行。』——点评:同时暴露三个坑——更新缓存的并发乱序问题、没考虑穿透击穿雪崩、没考虑更新失败的兜底。听起来做过,但没踩过坑也没想过边界。
怎么练这道题
- 打开 模拟练习,选择「后端开发」方向,限时 3 分钟作答本题。
- 对照上方答题框架,逐点检查:哪些要素没覆盖、哪里表达啰嗦。
- 用自己项目的真实经历替换框架中的占位内容,重讲一遍并录音回听。
这类题在真实面试中常被追问细节,
建议进入限时模式练一遍。