Yihui’s Blog

什么是缓存?有什么价值?

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

一句话答案

缓存是把可重建的数据副本放到读取成本更低的层,减少权威数据源的访问与请求延迟;收益取决于命中率,代价是内存、失效、一致性和故障回源。

面试口语版(约 60 秒)

以商品详情为例,数据库是权威来源,Redis 保存热点商品的副本。读请求先查缓存,命中直接返回;未命中时查数据库并写回缓存。商品更新时先成功更新数据库,再让对应缓存失效,下一次读取再回源填充。这样把重复读从数据库移走,降低响应时间和后端压力,适合读多写少、计算昂贵或热点明显的数据。设计时先确定可接受的陈旧时间,再定 TTL、容量与淘汰策略,并准备缓存不可用或热点失效时的回源限流。缓存不能当成唯一事实来源,命中率高也不说明数据一定正确。

原理与场景

场景可能收益必须处理的问题
商品详情、公共配置重复读取快,降低主库负载更新后失效、热点重建
复杂计算结果避免重复计算键包含完整输入,处理结果版本
强实时余额可能降低读延迟陈旧值风险高,关键判断要读权威状态

常见 cache-aside(旁路缓存) 读流程是“查缓存 → 未命中查数据库 → 回填”;写流程通常是“更新数据库 → 失效缓存”。但并发读可能在写入前读到旧数据库值、却在缓存删除后才回填,从而重新缓存旧值。TTL 只能限制这次旧副本的生命周期,不能让读写自动线性一致。高一致性场景需版本校验、序列化回填或直接读权威存储。

取舍与易错点

  • 设置内存上限和适合访问形态的淘汰策略,关注被淘汰后的回源量。
  • TTL 是兜底,不替代更新路径主动失效;热点键还要避免同时回源。
  • 关注命中/未命中率、缓存与数据库延迟、回源并发、陈旧数据问题和淘汰数。
  • “加 Redis 一定更快”并不成立;命中率低或序列化、网络成本高时,整体收益可能不足。

面试官递进追问

  1. 哪类数据适合缓存,哪类不适合?
  2. 为什么更新数据库后通常失效缓存,而不是只等 TTL?
  3. 数据库更新与缓存失效之间出现并发读,可能发生什么竞态?

自测

  • 不看笔记,60 秒用商品详情讲清命中、未命中、更新三条路径。
  • 列出上线前要测的四个指标,以及缓存不可用时的降级选择。

参考资料

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

Maintained by · YihuiEdit on GitHub

Keep reading

View all posts

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

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

Read article

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

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

Read article

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

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

Read article