§ 00概述
当读流量成为主要矛盾,缓存是性价比最高的性能工程:一次投入,读性能翻倍再翻倍,数据库负载断崖下降。但缓存不是加一个 Redis 那么简单——它是一套分层防线,每一层有自己的职责、失效策略与失守后果。
本章把缓存拆成三级讲清楚:请求侧的 CDN(静态与边缘)、应用侧的本地缓存(进程内毫秒响应)、共享侧的分布式缓存(Redis 集中管理)。以及三条著名的故障带——穿透、击穿、雪崩——各自的成因、防线与预案。
数据集延续 7 类结构:组件选型、成本、命中率与延迟基线、演进信号、检查清单、翻车点、FAQ。
§ 01演进定位
缓存的本质是用一致性换性能的分层决策。越靠近用户的一层越快、一致性越弱;越靠近数据库的一层越慢、越权威。多级缓存的设计工作,就是为每一类数据在「速度-一致性」光谱上选一个正确的位置。
引入缓存的直接动机通常是数据库读压力:读 QPS 超过 500 后,数据库 CPU 随流量线性爬升,而其中 80% 以上的查询是重复的。把重复查询挡在缓存层,数据库只需承担真正的写与冷读。
我们给客户的默认预期是:合理的多级缓存可以把数据库读负载降低 70% 以上、核心接口 P95 从数百毫秒进入 100ms 以内——但前提是把「失效与故障」想在前头。
§ 02技术架构
L1 本地缓存(进程内,如 Caffeine/内置 Map):存放极热且容忍短暂不一致的数据(配置、字典、开关),容量小、TTL 短(秒级),用版本号或发布广播失效。
L2 分布式缓存(Redis 集群):业务热数据的统一缓存层,按业务域划分 key 前缀与过期策略;热点 key 考虑本地副本,大 value 拆分或压缩。这是缓存的主战场。
L3 边缘缓存(CDN):静态资源、可缓存页面片段推到边缘节点,回源率控制在 10% 以内。三层防线的故障带各自设防:穿透(查不存在数据)用布隆过滤器或空值缓存;击穿(热 key 过期瞬间打穿)用互斥重建或逻辑过期;雪崩(大面积同时失效)用 TTL 随机抖动 + 多级兜底限流。
§ 03实施路径
第一阶段(1 周)读路径梳理:按业务域列出全部读接口,标注 QPS、一致性要求、可缓存性,产出「缓存候选清单」——这一步决定成败,不该缓存的缓存了比不缓存更糟。
第二阶段(1-2 周)L2 落地:Redis 接入与 key 规范、读写旁路(Cache-Aside)封装、TTL 与抖动策略、空值与布隆过滤防穿透。灰度 20% 读流量观察命中率。
第三阶段(1 周)L1/L3 与防线完善:本地缓存覆盖极热字典,静态与可缓存路由上 CDN,压测验证击穿与雪崩场景(强制清空缓存重建),校准监控看板。总周期 3-4 周。
§ 04客户价值与适用判断
该上:读多写少(读写比 > 5:1)、数据库 CPU 被重复查询吃掉、核心接口延迟不可接受。三者命中其一即应评估。
成本视角:在 03 章基础上增加 Redis 容量与 CDN 流量,月增约 ¥200-400,换来数据库扩容推迟一个季度以上——缓存的钱是替数据库省的。
慎用:强一致数据(库存扣减、账务余额)不能只靠缓存兜底;写多读少的数据缓存命中率天然低。缓存是性能工具,不是架构勋章。
§ D01组件与选型清单
DATA多级缓存 · 标准组件栈三级防线
| 层级 | 组件 | 选型建议 | 职责与要点 |
|---|
| L3 边缘 | CDN | 静态资源 + 可缓存路由 | 回源率 < 10%,边缘命中毫秒级返回 |
| L1 本地 | 进程内缓存 | 容量 ≤ 256MB · TTL ≤ 60s | 配置/字典/开关等极热数据,广播失效 |
| L2 分布式 | 云 Redis 集群 | 4GB 起按容量扩展 | 业务热数据主缓存层,key 规范按域划分 |
| 防穿透 | 布隆过滤器 / 空值缓存 | 按业务二选一 | 拦截不存在数据的恶意或异常查询 |
| 防击穿 | 互斥重建 / 逻辑过期 | 热 key 白名单管理 | 热 key 过期瞬间只放一个请求回源 |
| 防雪崩 | TTL 随机抖动 | 基准 ± 20% 抖动 | 错峰失效 + 降级限流兜底 |
| 一致性 | 版本号失效 | 写后广播失效 | 本地缓存跨节点失效的轻量方案 |
Cache-Aside(读旁路、写失效)是默认模式;除非团队对一致性有深度把控,否则不建议引入写穿透类复杂模式。
§ D02成本测算数据集
DATA成本测算示例(在 03 章基础上增量 · 月度)月度 · CNY
| 项目 | 规格 | 月成本 | 说明 |
|---|
| Redis 扩容 | 2GB → 4GB 集群版 | ≈ ¥140 | 容量翻倍支撑缓存主层 |
| CDN 流量 | 200GB/月 · 国内 | ≈ ¥40 | 静态与可缓存路由分流 |
| 带宽节省 | 回源流量下降 | -≈ ¥30 | CDN 抵扣源站带宽 |
| 监控增强 | 命中率/延迟看板 | ≈ ¥10 | 命中率是缓存的体温计 |
增量合计 ≈ ¥160/月 · 换取数据库读负载 -70%
缓存的隐性收益最大:它把数据库扩容(05 章只读实例)的到来时间平均推迟 2-4 个季度。
§ D03关键指标基准
DATA可用性与体验基线SLO 参考
| 指标 | 无缓存基线 | 本阶段目标 | 行业良好 |
|---|
| 缓存命中率(L2) | 0% | ≥ 90% | ≥ 98% |
| 核心接口 P95 | 500-800ms | < 150ms | < 50ms |
| 数据库读 QPS 占比 | 100% 的读 | < 30% 的读 | < 10% 的读 |
| CDN 回源率 | 100% | < 15% | < 5% |
| 缓存故障恢复 | — | 清空后 5 分钟内重建 | 预热机制自动重建 |
命中率低于 80% 时先查 key 设计与 TTL,再考虑扩容——命中率是最容易被忽视的成本杠杆。
§ D04演进触发信号
DATA什么时候必须走向下一阶段任一命中即评估
| 触发信号 | 判定阈值 | 演进方向 |
|---|
| 写压力接棒读压力 | 写 QPS > 200 且持续上升 | 读写分离与分库分表(05) |
| 热点 key 单点过热 | 单 key QPS > 5,000 | 本地副本 / key 拆分(本章 L1) |
| 检索需求复杂化 | LIKE 模糊查询大量出现 | 搜索引擎与 NoSQL(07) |
| 缓存集群本身过载 | Redis 内存 > 70% 或带宽打满 | 集群分片扩容(本章) |
| 多业务域数据耦合 | 跨域缓存 key 互相失效 | 业务拆分(08) |
§ D05上线检查清单
候选清单先行读接口全部登记 QPS/一致性/可缓存性,评审后再动手
key 规范统一业务域前缀 + 实体 + ID,TTL 与抖动策略成文
三条防线齐备穿透(布隆/空值)、击穿(互斥/逻辑过期)、雪崩(抖动+限流)
命中率看板L1/L2/CDN 三级命中率与回源率实时可见,低于阈值告警
重建演练强制清空缓存压测,验证互斥重建与预热不压垮数据库
降级预案Redis 不可用时直读数据库的限流开关与预案演练
§ D06高频翻车点
大 value 无治理序列化对象整存整取,单 key 数 MB 拖垮 Redis 带宽
TTL 一刀切全部 30 分钟整点过期,午夜零点集体失效酿成雪崩
缓存与库双写不一致先更库后删缓存的基本盘没守住,引入花式同步徒增故障
命中率当成绩效为了命中率把不可缓存的数据硬塞缓存,一致性事故接踵而至
Redis 单实例裸奔无副本无持久化策略,Redis 重启等于数据库重启
§ D07常见问答
DATA多级缓存 · 问答数据集4 组
| 问题 | 答案 |
|---|
| 先上缓存还是先读写分离? | 读压力优先缓存:成本只有读写分离的零头,且命中率达标后数据库扩容需求大幅推迟。写压力则直接看 05 章。 |
| 本地缓存和 Redis 怎么分工? | 本地缓存放「极热 + 容忍秒级不一致」(配置、字典),Redis 放业务热数据。反着放会得到最差组合:本地大缓存难失效,Redis 存冷数据浪费。 |
| 怎么判断该缓存哪些接口? | 三个条件同时满足才缓存:读多写少、可容忍短暂不一致、命中可预期(非长尾)。登记清单评审后再动手,不要边写边猜。 |
| 缓存一致性有没有银弹? | 没有。工业界默认「先更库、后删缓存 + TTL 兜底」,接受秒级不一致。要求强一致的数据本来就不该进缓存,回到数据库事务里解决。 |
§ D8角色分工数据集
DATA角色分工数据集本阶段人员配置
| 角色 | 核心职责 | 投入度 | 备注 |
|---|
| 后端 | 缓存策略 · 三级防线 · 失效封装 | 60% | 改造主力 |
| DBA | 候选清单评审 · 命中率治理 | 30% | 数据视角把关 |
| 运维 | Redis 集群 · CDN 配置 · 告警 | 40% | 层间配置主责 |
| 业务 | 一致性容忍度确认 | 10% | 逐接口签认 |
§ D9风险登记册
DATA风险登记册概率 × 影响
| 风险 | 概率 | 影响 | 缓解措施 |
|---|
| 缓存雪崩(大面积同时失效) | 低 | 致命 | TTL 抖动 + 限流兜底 + 强制清空演练 |
| 热 key 过期瞬间击穿 | 中 | 严重 | 互斥重建 / 逻辑过期 + 热点白名单 |
| 双写不一致引发业务投诉 | 中 | 中 | 先更库后删缓存铁律 + 对账任务 |
| 大 value 拖垮 Redis 带宽 | 中 | 中 | value 大小上限 + 压缩/拆分规范 |
§ D10监控告警清单
DATA监控告警清单阈值即责任
| 监控对象 | 指标 | 告警阈值 | 响应动作 |
|---|
| Redis | 命中率 | < 85% | 工单 · key 设计与 TTL 复盘 |
| Redis | 内存 / 连接数 | > 70% / > 80% | 短信 · 扩容评估 |
| 边缘 | CDN 回源率 | > 20% | 工单 · 缓存策略矩阵复核 |
| 数据库 | 读 QPS 突增 | 较基线 +50% | 电话 · 排查穿透 |
| 业务 | 一致性投诉 | ≥ 2 起/周 | 复盘 · 失效链路审查 |
§ D12实施时间线
DATA实施时间线周为单位
| 周次 | 里程碑 | 责任角色 | 出口物 |
|---|
| W1 | 读路径画像 | 后端 + DBA | 缓存候选清单评审通过 |
| W2 | L2 落地 | 后端 | Cache-Aside 封装 + key 规范发布 |
| W3 | L1/L3 与防线 | 后端 + 运维 | 本地缓存 + CDN + 三防线就位 |
| W4 | 演练与验收 | 全员 | 清空重建演练 + 命中率达标 |
§ D13SLA 与容灾基线
DATASLA 与容灾基线对内承诺
| 指标 | 基线承诺 | 度量方式 | 未达标处置 |
|---|
| 核心接口 P95 | < 150ms | APM 采样 | 慢接口专项治理 |
| 缓存命中率(L2) | ≥ 90% | Redis 统计 | 候选清单重新评审 |
| Redis 可用性 | 99.9% | 云 SLA 报表 | 集群版 + 跨 AZ |
| 缓存重建时长 | 清空后 < 5 分钟 | 演练实测 | 预热脚本化 |
§ D14应急预案
DATA应急预案一页纸预案
| 故障场景 | 典型现象 | 处置步骤 | 升级路径 |
|---|
| Redis 整体不可用 | 大面积回源 · DB 压力陡增 | ① 开启直读限流开关 ② 恢复/切换实例 ③ 分批预热 | DB 过载 → 降级非核心接口 |
| 缓存雪崩 | 整点后响应集体变慢 | ① 限流兜底 ② TTL 抖动修复 ③ 错峰预热 | 持续 > 10 分钟 → 电话升级 |
| 热 key 打爆单分片 | 单节点 CPU 100% | ① 本地副本 ② key 拆分 ③ 限流保护 | 影响核心链路 → 立即处置 |
| 一致性事故 | 用户看到旧数据 | ① 定位失效断点 ② 定向清缓存 ③ 修复失效链路 | 资损类 → 立即升级业务 |
§ D15首年成本明细
DATA首年成本明细CNY
| 项目 | 月成本 | 年成本 | 备注 |
|---|
| Redis 扩容至 4G 集群版 | ≈ ¥140 | ≈ ¥1,680 | 较 03 章 +140 |
| CDN 流量 200GB | ≈ ¥40 | ≈ ¥480 | 静态分流 |
| 带宽节省 | -≈ ¥30 | -≈ ¥360 | CDN 抵扣 |
| 监控增强 | ≈ ¥10 | ≈ ¥120 | 命中率看板 |
首年增量 ≈ ¥1,920。对比数据库扩容(数万元级),缓存是全系列 ROI 最高的性能投资。
§ D16团队能力要求
DATA团队能力要求按需补齐
| 能力项 | 要求级别 | 如何补齐 |
|---|
| 缓存模式与一致性 | 必须 | Cache-Aside 代码评审 + 演练 |
| Redis 运维 | 必须 | 集群版实操 + 慢日志分析 |
| 压测与容量评估 | 建议 | 清空重建演练计时 |
| CDN 配置 | 建议 | 缓存策略矩阵评审参与 |
§ D17关键决策速查(ADR)
DATA关键决策速查(ADR)本阶段 4 个决策
| 决策 | 备选方案 | 结论理由 |
|---|
| 缓存模式 | Cache-Aside vs Write-Through | Aside:简单可控,一致性责任清晰 |
| 防穿透 | 布隆 vs 空值缓存 | 按 key 空间规模二选一,评审定 |
| 本地缓存 | 引入 vs 不引入 | 仅极热字典引入,TTL ≤ 60s |
| CDN 范围 | 全站 vs 静态+可缓存路由 | 后者:登录态路由绝不进边缘 |
§ D18高频面试题
DATA高频面试题本阶段 4 题
| 问题 | 考察点 | 优秀回答特征 |
|---|
| 缓存与数据库一致性方案? | 一致性设计 | 先更库后删缓存 + TTL 兜底,承认权衡 |
| 缓存雪崩三层防线? | 故障预防 | 穿透/击穿/雪崩各自独立说清 |
| 命中率低怎么排查? | 数据思维 | key 设计→TTL→候选清单复评 |
| 什么数据不该缓存? | 架构判断 | 强一致/写多/低频三类明确说出 |
§ D19命令与操作速查
DATA命令与操作速查缓存专项
| 场景 | 命令/操作 | 说明 |
|---|
| 命中率 | redis-cli info stats | keyspace_hits / misses |
| 大 key 排查 | redis-cli --bigkeys | 生产低峰执行 |
| 热 key 识别 | monitor 抽样/客户端统计 | 避免全量 monitor |
| 定向清理 | 按前缀 scan + del | 禁用 keys * |
§ D20采购与商务要点
DATA采购与商务要点本阶段采购项
| 采购项 | 询价要点 | 商务注意 |
|---|
| Redis 集群版 | 分片数与代理模式差异 | 扩容是否停业 |
| CDN 流量包 | 阶梯单价 + 回源计费口径 | 预热与刷新配额 |
| 监控增强 | 命中率指标采集粒度 | 与告警平台打通 |
§ D21阶段 KPI 卡
DATA阶段 KPI 卡验收口径
| KPI | 口径 | 目标 |
|---|
| 命中率 | Redis 统计 | ≥ 90% |
| 核心 P95 | APM 采样 | < 150ms |
| DB 读占比 | 读 QPS 分布 | < 30% |
| 重建时长 | 清空演练 | < 5 分钟 |
§ D22交接清单
DATA交接清单换人不换知识
| 交接项 | 载体 | 验收 |
|---|
| 缓存候选清单 | Wiki | 与线上 key 一一对应 |
| key 规范文档 | Wiki | 新 key 评审有据 |
| 防线配置 | 配置中心 | 三防线参数可查 |
| 命中率看板 | 监控平台 | 低命中自动告警 |
§ D23演进检查点评审
DATA演进检查点评审走向 05 章前
| 检查项 | 达标标准 | 结果 |
|---|
| 命中率达标 | L2 命中率 ≥ 90% | 通过/不通过 |
| 三防线齐备 | 穿透/击穿/雪崩各有验证 | 通过/不通过 |
| 一致性对账 | 缓存与库差异对账任务运行 | 通过/不通过 |
| 降级预案 | Redis 不可用直读限流演练 | 通过/不通过 |