← 返回题目列表

什么是多级缓存架构?本地缓存和分布式缓存怎么配合?

高频 中等 第 7 / 26 题 更新于 2026/07/28
多级缓存本地缓存Redis

简化版

多级缓存是把缓存分成多层,例如浏览器/CDN、本地缓存、Redis、数据库。越靠近请求入口,访问越快但一致性越弱;越靠近数据库,一致性越好但延迟更高。本地缓存适合热点、读多写少、能容忍短暂旧值的数据;Redis 适合共享缓存、统一失效和跨实例访问。

详细版

常见链路:本地缓存(Caffeine)→ Redis → 数据库。读请求先查本地缓存,未命中查 Redis,Redis 未命中再查 DB 并逐层回填。

层级优点缺点适合数据
本地缓存极快、无网络开销、抗热点每个实例一份,一致性弱热点配置、商品快照
Redis多实例共享、容量较大、可统一失效有网络开销,依赖集群通用业务缓存
DB权威数据源慢,不能承受高读流量最终真实数据

多级缓存要重点处理一致性:数据变更时删除 Redis,并通过消息或版本号通知本地缓存失效;本地缓存 TTL 要短;强一致数据不要放长时间本地缓存。

完整版教学

一、为什么需要多级缓存

单层 Redis 能挡住很多数据库流量,但面对热点 key,所有应用实例仍然会一起访问 Redis。多级缓存把最热的一批数据放到应用本地内存,绝大多数请求在进程内返回,既减少网络开销,也保护 Redis。

同时,多级缓存还能提高容灾能力。Redis 短暂抖动时,本地缓存可以继续返回部分热点数据,不至于所有请求直接打 DB。

二、每一层的职责不同

本地缓存追求极致速度,适合小而热、变化不频繁的数据。Redis 追求共享和集中管理,适合大多数业务缓存。数据库是权威来源,负责最终正确性。

设计时不要把所有数据都塞进本地缓存。本地缓存每个应用实例都有一份,数据变更后很难做到瞬时全部失效。如果把余额、实时权限、库存扣减放进去,很容易读到旧值。

三、读流程怎么设计

典型读流程是:先读本地缓存,命中直接返回;未命中读 Redis;Redis 命中后回填本地缓存;Redis 未命中再查数据库,并回填 Redis 和本地缓存。

为了避免击穿,DB 回源时可以加互斥锁或 singleflight。为了避免本地缓存无限膨胀,需要设置最大容量、TTL、淘汰策略和监控。

四、写流程和失效通知

写操作通常以数据库为准:先更新数据库,再删除 Redis,然后通过 MQ、配置中心、发布订阅等方式通知各应用实例删除本地缓存。也可以让本地缓存设置很短 TTL,即使通知失败也能尽快过期。

更稳的做法是给数据带版本号。本地缓存读到旧版本时,即使没收到删除通知,也能在下一次比对时发现版本落后。

五、常见坑

第一个坑是本地缓存 TTL 太长,导致修改后某些机器长时间读旧值。第二个坑是只删 Redis 不删本地缓存,线上会出现“有的机器正确,有的机器错误”。第三个坑是本地缓存容量不控,最终撑爆 JVM 内存。

多级缓存不是层数越多越好。每加一层,命中率可能提升,但一致性和排障复杂度也增加。只给真正热、真正值得缓存的数据加层。

六、面试追问与工程边界

面试官常会问“本地缓存怎么失效”。常见做法是短 TTL、消息通知、配置中心推送、版本号校验。只靠 TTL 简单但延迟不可控;消息通知实时性更好但可能丢;版本号校验更稳,但实现成本更高。生产系统通常组合使用。

还要关注内存风险。本地缓存运行在应用 JVM/进程里,容量不控会挤压业务内存,引发 GC 或 OOM。必须设置最大容量、过期策略、命中率监控和手动清理入口。多级缓存提升性能,也把一致性和排障复杂度带进来了。

七、常见误区与追问

这道题不能只背概念,要把「多级缓存」放回真实分布式系统里解释:参与方是谁、状态怎么流转、失败后怎么恢复,以及它在一致性、性能、可用性之间做了什么取舍。

回答层次要讲清的内容容易漏掉的边界
核心结论多级缓存用本地缓存、分布式缓存、数据库分层承接流量,提升性能但增加一致性复杂度不要停在名词解释
流程机制先读本地缓存 -> 未命中读 Redis -> 未命中查数据库 -> 回填 Redis 和本地 -> 写入时广播失效或短 TTL 收敛说明触发方、存储方、确认点和兜底
工程取舍本地 Caffeine 1 秒 TTL + Redis 5 分钟 TTL,可让热点读多数在进程内完成缓存提升吞吐但会引入旧值、热点、内存和失效风暴问题
多级缓存 面试拆解:
1. 先读本地缓存
2. 未命中读 Redis
3. 未命中查数据库
4. 回填 Redis 和本地
5. 写入时广播失效或短 TTL 收敛

记忆钩子:先说明缓存承担的读写压力,再拆穿透、击穿、雪崩、热点、一致性和淘汰策略;回答时要紧扣「多级缓存」这道题,不要把相邻概念混成一段泛泛的分布式套话。

  • 误区:缓存层级越多越好。 层级越多一致性和失效链路越复杂。
  • 误区:本地缓存不需要失效。 多实例本地缓存可能各自旧值,需要短 TTL 或广播。
  • 误区:多级缓存能替代数据库扩容。 它保护读流量,但写入、冷数据和一致性仍依赖数据库。
  • 追问:本地缓存适合什么? 热点小对象、读多写少、可接受短暂旧值的场景。
  • 追问:如何失效本地缓存? 消息广播、配置中心事件、短 TTL 或版本号。
  • 追问:如何防止缓存放大内存? 容量上限、淘汰策略、对象大小控制和监控。

八、加强记忆

多级缓存按距离分层:本地缓存最快但一致性最弱,Redis 共享能力强,数据库最权威。读链路逐层查、逐层回填;写链路以数据库为准,删除 Redis,并通知本地缓存失效。强一致数据别长时间放本地缓存,本地缓存要短 TTL、限容量、可失效、可监控。