日期:2026-09-27
标签:#面试 #场景设计 #Redis
难度:简单
来源:牛面场景题
答案说明:独立整理(站内题目标记为 VIP,未读取会员答案)
一句话答案
缓存是把可重建的数据副本放到读取成本更低的层,减少权威数据源的访问与请求延迟;收益取决于命中率,代价是内存、失效、一致性和故障回源。
面试口语版(约 60 秒)
以商品详情为例,数据库是权威来源,Redis 保存热点商品的副本。读请求先查缓存,命中直接返回;未命中时查数据库并写回缓存。商品更新时先成功更新数据库,再让对应缓存失效,下一次读取再回源填充。这样把重复读从数据库移走,降低响应时间和后端压力,适合读多写少、计算昂贵或热点明显的数据。设计时先确定可接受的陈旧时间,再定 TTL、容量与淘汰策略,并准备缓存不可用或热点失效时的回源限流。缓存不能当成唯一事实来源,命中率高也不说明数据一定正确。
原理与场景
| 场景 | 可能收益 | 必须处理的问题 |
|---|---|---|
| 商品详情、公共配置 | 重复读取快,降低主库负载 | 更新后失效、热点重建 |
| 复杂计算结果 | 避免重复计算 | 键包含完整输入,处理结果版本 |
| 强实时余额 | 可能降低读延迟 | 陈旧值风险高,关键判断要读权威状态 |
常见 cache-aside(旁路缓存) 读流程是“查缓存 → 未命中查数据库 → 回填”;写流程通常是“更新数据库 → 失效缓存”。但并发读可能在写入前读到旧数据库值、却在缓存删除后才回填,从而重新缓存旧值。TTL 只能限制这次旧副本的生命周期,不能让读写自动线性一致。高一致性场景需版本校验、序列化回填或直接读权威存储。
取舍与易错点
- 设置内存上限和适合访问形态的淘汰策略,关注被淘汰后的回源量。
- TTL 是兜底,不替代更新路径主动失效;热点键还要避免同时回源。
- 关注命中/未命中率、缓存与数据库延迟、回源并发、陈旧数据问题和淘汰数。
- “加 Redis 一定更快”并不成立;命中率低或序列化、网络成本高时,整体收益可能不足。
面试官递进追问
- 哪类数据适合缓存,哪类不适合?
- 为什么更新数据库后通常失效缓存,而不是只等 TTL?
- 数据库更新与缓存失效之间出现并发读,可能发生什么竞态?
自测
- 不看笔记,60 秒用商品详情讲清命中、未命中、更新三条路径。
- 列出上线前要测的四个指标,以及缓存不可用时的降级选择。
参考资料
资料核对日期:2026-09-27。