Reference · 004 · 打印友好 · 配套 Lesson 0005
缓存模式速查表
四种读写模式
| 模式 | 机制 | 适用/代价 |
|---|---|---|
| Cache-Aside 旁路缓存 ✅ |
应用自己管:读 miss 回源并回填;写 = 更新 DB + 删除缓存 | 默认首选;应用层代码维护,有短暂不一致窗口 |
| Read-Through | 缓存层代理回源:应用只访问缓存,miss 由缓存组件自己读 DB 回填 | 应用代码更薄;需要支持该模式的组件 |
| Write-Through | 写先到缓存层,由它同步写 DB | 一致性好;写延迟高,冷数据白写 |
| Write-Behind | 写只进缓存,异步批量刷 DB | 写性能最好;缓存挂了丢数据——只用于可丢数据 |
为什么写路径是「删」不是「更新」
- 并发写交错:A 先写 DB、B 后写 DB,但 B 先更新缓存 → 缓存留下 A 的旧值
- 写时更新的值未必被读(lazy 重建即可),白算还占内存
- 修补并发缝隙的手段:延迟双删(写后延迟数百 ms 再删一次)
三大问题对照
| 为什么没挡住 | 解法(预防 → 兜底) | |
|---|---|---|
| 穿透 数据不存在 |
恶意/无效 key 永不命中,每次打 DB | 空值短 TTL 缓存;布隆过滤器前置(说「无」必无,说「有」可能误报)→ 接口层参数校验 |
| 击穿 单热 key 过期 |
热 key 失效瞬间,并发全部回源重建 | 互斥锁/single-flight 只放一人重建;逻辑过期(不真删,异步刷新);热 key 永不过期 |
| 雪崩 大面积失效 |
大量 key 同时过期 / 缓存集群宕机 | TTL 加随机抖动错峰;集群高可用(主从+哨兵/集群);熔断降级 + 本地缓存二级兜底 |
热 key 与 sizing
- 热 key(单 key QPS 打满分片):本地缓存二级挡流量;key 复制 N 份(
key#1..N)随机读打散 - 容量:按 80/20 估——缓存 20% 热数据;内存 = 热数据量 × 放大系数(Redis 元数据 ~1.5×)
- 命中率是核心监控:每降 1%,回源流量升约 10%
- TTL 设计:基础时长 + random(0, Δ) 抖动;脏数据容忍度决定 TTL 上限