← 返回官网架构演进之路 · ARCHITECTURE EVOLUTION · 04/10
03 · 应用集群与负载均衡05 · 读写分离与分库分表
阶段 04 · 加速

多级缓存架构白皮书

用层级换速度:本地缓存、分布式缓存与 CDN 的分层防线,穿透击穿雪崩逐一设防。

04 / 10阅读 ≈ 12 分钟适用:读多写少 · 读 QPS > 500 · 响应时长敏感骏瑞轩集团 · 云与数字科技

§ 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静态与可缓存路由分流
带宽节省回源流量下降-≈ ¥30CDN 抵扣源站带宽
监控增强命中率/延迟看板≈ ¥10命中率是缓存的体温计
增量合计 ≈ ¥160/月 · 换取数据库读负载 -70%

缓存的隐性收益最大:它把数据库扩容(05 章只读实例)的到来时间平均推迟 2-4 个季度。

§ D03关键指标基准

DATA可用性与体验基线SLO 参考
指标无缓存基线本阶段目标行业良好
缓存命中率(L2)0%≥ 90%≥ 98%
核心接口 P95500-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 起/周复盘 · 失效链路审查

§ D11工具链选型

DATA工具链选型缓存专项
环节推荐备选选择理由
本地缓存Caffeine / 进程内 LRUGuava CacheTTL 与容量上限内建
分布式缓存云 Redis 集群版自建 Redis Cluster托管主备与扩容
防穿透布隆过滤器空值缓存(短 TTL)按 key 空间规模二选一
观测命中率看板 + 慢日志REDIS 监控导出命中率是唯一真理

§ D12实施时间线

DATA实施时间线周为单位
周次里程碑责任角色出口物
W1读路径画像后端 + DBA缓存候选清单评审通过
W2L2 落地后端Cache-Aside 封装 + key 规范发布
W3L1/L3 与防线后端 + 运维本地缓存 + CDN + 三防线就位
W4演练与验收全员清空重建演练 + 命中率达标

§ D13SLA 与容灾基线

DATASLA 与容灾基线对内承诺
指标基线承诺度量方式未达标处置
核心接口 P95< 150msAPM 采样慢接口专项治理
缓存命中率(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-≈ ¥360CDN 抵扣
监控增强≈ ¥10≈ ¥120命中率看板

首年增量 ≈ ¥1,920。对比数据库扩容(数万元级),缓存是全系列 ROI 最高的性能投资。

§ D16团队能力要求

DATA团队能力要求按需补齐
能力项要求级别如何补齐
缓存模式与一致性必须Cache-Aside 代码评审 + 演练
Redis 运维必须集群版实操 + 慢日志分析
压测与容量评估建议清空重建演练计时
CDN 配置建议缓存策略矩阵评审参与

§ D17关键决策速查(ADR)

DATA关键决策速查(ADR)本阶段 4 个决策
决策备选方案结论理由
缓存模式Cache-Aside vs Write-ThroughAside:简单可控,一致性责任清晰
防穿透布隆 vs 空值缓存按 key 空间规模二选一,评审定
本地缓存引入 vs 不引入仅极热字典引入,TTL ≤ 60s
CDN 范围全站 vs 静态+可缓存路由后者:登录态路由绝不进边缘

§ D18高频面试题

DATA高频面试题本阶段 4 题
问题考察点优秀回答特征
缓存与数据库一致性方案?一致性设计先更库后删缓存 + TTL 兜底,承认权衡
缓存雪崩三层防线?故障预防穿透/击穿/雪崩各自独立说清
命中率低怎么排查?数据思维key 设计→TTL→候选清单复评
什么数据不该缓存?架构判断强一致/写多/低频三类明确说出

§ D19命令与操作速查

DATA命令与操作速查缓存专项
场景命令/操作说明
命中率redis-cli info statskeyspace_hits / misses
大 key 排查redis-cli --bigkeys生产低峰执行
热 key 识别monitor 抽样/客户端统计避免全量 monitor
定向清理按前缀 scan + del禁用 keys *

§ D20采购与商务要点

DATA采购与商务要点本阶段采购项
采购项询价要点商务注意
Redis 集群版分片数与代理模式差异扩容是否停业
CDN 流量包阶梯单价 + 回源计费口径预热与刷新配额
监控增强命中率指标采集粒度与告警平台打通

§ D21阶段 KPI 卡

DATA阶段 KPI 卡验收口径
KPI口径目标
命中率Redis 统计≥ 90%
核心 P95APM 采样< 150ms
DB 读占比读 QPS 分布< 30%
重建时长清空演练< 5 分钟

§ D22交接清单

DATA交接清单换人不换知识
交接项载体验收
缓存候选清单Wiki与线上 key 一一对应
key 规范文档Wiki新 key 评审有据
防线配置配置中心三防线参数可查
命中率看板监控平台低命中自动告警

§ D23演进检查点评审

DATA演进检查点评审走向 05 章前
检查项达标标准结果
命中率达标L2 命中率 ≥ 90%通过/不通过
三防线齐备穿透/击穿/雪崩各有验证通过/不通过
一致性对账缓存与库差异对账任务运行通过/不通过
降级预案Redis 不可用直读限流演练通过/不通过

§ →继续演进