第一章 缓存架构全景:架构分层、核心组件、数据流概览

1.1 缓存架构的边界与定义

缓存(Cache) 是通过在高速存储介质中临时存储数据副本,以降低数据访问延迟、减轻后端系统负载的一种技术手段。缓存架构的边界涵盖从客户端到数据库的全链路,其核心职责是:

  • 加速读请求:将热点数据提前加载到更快的存储层
  • 保护后端:减少数据库/微服务的并发冲击
  • 提升吞吐:通过内存级访问延迟大幅提高系统 QPS
适用范围:读多写少、数据一致性要求不极端、可接受短期 stale 数据的业务场景,如用户会话、商品详情、配置中心。

1.2 架构分层

生产级缓存架构通常分为五层,每层承担不同的职责与粒度:

层级 典型实现 延迟 容量 核心职责
客户端缓存 浏览器 Cache / HTTP Cache / 移动端 LRU <1ms MB 级 减少重复网络请求
CDN / 反向代理 CDN Edge / Nginx / Varnish 1~5ms GB 级 静态资源加速、防源站过载
本地缓存 Caffeine / Guava Cache / Ehcache <1ms 百 MB 级 进程内热点缓存,零网络开销
分布式缓存 Redis Cluster / Memcached / Tair 1~5ms TB 级 跨进程共享、动态扩缩容
持久化缓存(可选) SSDCache / 本地 DB 缓存 5~10ms GB~TB 级 降级回源、冷热数据交换
关键原则:缓存层级越靠近客户端,延迟越低,容量越小;越靠近后端,延迟略高,容量越大。
典型架构中本地缓存与分布式缓存会组合使用——本地缓存兜住 超高频 读请求,分布式缓存承载 大规模共享数据。

1.3 核心组件职责

一个完整的缓存架构由以下组件协作完成:

  • 缓存客户端 SDK:负责 Key 哈希、连接池管理、序列化/反序列化(如 Lettuce、Jedis、Redisson)
  • 缓存代理层:如 Redis Proxy(Twemproxy)、Nginx + lua-resty-redis,用于路由、限流、故障切换
  • 缓存节点:实际存储引擎,如 Redis 主从、Cluster 分片、Memcached slab 管理
  • 一致性协议:Redis Cluster Gossip、CRDT、租约机制,保证分片间数据元信息和拓扑同步
  • 淘汰策略:LRU、LFU、TTL 过期、随机淘汰,决定内存资源怎么回收
  • 监控与运维:Info 命令、slowlog、内存告警、bigkey 检测、热点 Key 识别
风险点:缓存组件之间缺少统一的 信任链路 会引入安全漏洞(如未认证的 Redis 暴露公网、未加密的代理连接)。生产环境必须启用密码认证、TLS 加密以及 IP 白名单。

1.4 数据流 / 控制流 / 信任链路概览

以典型 读缓存穿透防护 场景为例,展示各层之间的交互:

  1. 请求到达:客户端通过 SDK 将 Key 经一致性哈希路由到 Redis 节点
  2. 本地缓存命中:若 Caffeine 中有数据,直接返回(无需网络 I/O)
  3. 分布式缓存命中:本地未命中,向 Redis 发起 GET,成功则回填本地缓存
  4. 穿透处理:Redis 未命中,使用互斥锁(分布式锁)防击穿,仅一个线程回源查数据库
  5. 回源写回:数据库返回后,同时更新 Redis(含 TTL)和本地缓存
  6. 控制流:监控 Agent 周期性采集 Redis INFO / slowlog,告警到 Prometheus + Grafana
  7. 信任链路:SDK 与 Redis 之间使用 AUTH 密码;代理与节点之间使用 TLS;本地缓存不与其他进程共享,无需鉴权
控制流关键配置示例(Redis 连接池与超时控制):
spring.redis.host=redis-cluster.example.com
spring.redis.password=${CACHE_PASSWORD}
spring.redis.lettuce.pool.max-active=16
spring.redis.lettuce.pool.max-wait=100ms
spring.redis.lettuce.shutdown-timeout=200ms

1.5 选型权衡矩阵

在架构设计阶段需要根据业务特征做出取舍:

维度 本地缓存优先 分布式缓存优先 混合方案
延迟 极低(<0.1ms) 低(1~5ms) 平均<1ms
容量 受限于 JVM 堆 可水平扩展到 TB 兼顾热点与规模
一致性 节点内强一致 最终一致(主从复制延迟) 需权衡本地与远端的写同步
运维复杂度 低(无外部依赖) 高(集群管理、扩缩容) 中等(需协调两级缓存失效)
典型瓶颈 缓存击穿(单机热点) 缓存穿透/雪崩 缓存一致性维护
风险点:
  • 缓存穿透:查询不存在的数据,每次都穿透到 DB。解决方案:布隆过滤器 + 空值缓存。
  • 缓存击穿:热点 Key 过期瞬间,高并发打到 DB。解决方案:互斥锁 / 永不过期 + 后台刷新。
  • 缓存雪崩:大量 Key 同一时间过期,或 Redis 宕机。解决方案:过期时间加随机偏移、多级缓存、熔断降级。
  • 数据不一致:写后更新缓存与 DB 的时序问题。解决方案:Cache-Aside 模式 + 延迟双删、CDC 订阅 binlog。

1.6 落地步骤

  1. 评估与需求分解:统计当前 QPS、热点比例、可接受延迟、一致性等级
  2. 选型验证:POC 测试 Redis Cluster vs Memcached,压测吞吐与延迟
  3. 容量规划:根据数据量 + 未来增长 × 1.5 估算内存,规划分片数量
  4. 架构设计:确定本地缓存最大容量(如 128MB)、分布式缓存 TTL、淘汰策略
  5. 监控与告警搭建:部署 Redis Exporter + Grafana,关键指标:命中率、逐出量、慢查询、内存使用率
  6. 灰度发布:先切 1% 流量,观察缓存命中率与 DB 负载变化,逐步全量

1.7 验收标准

维度 验收指标 建议阈值
命中率 整体缓存命中率 > 95% 目标 99%
延迟 P99 读延迟 ≤ 5ms 本地缓存 ≤ 1ms
吞吐量 缓存层支持 ≥ 2x 峰值 QPS 压测验证
一致性 缓存与 DB 数据最大差异 ≤ 5s 业务容忍窗口
可用性 缓存集群 ≥ 99.99% 多副本 + 自动故障转移
监控覆盖 命中率、大 Key、热 Key、慢查询、连接数等告警均已配置 全部覆盖
缓存架构分层与数据流 缓存架构分层与数据流 客户端(App / Browser) CDN / 反向代理 本地缓存(Caffeine) 分布式缓存(Redis Cluster) 数据库(MySQL / PostgreSQL) 监控 Agent Grafana + Prometheus 数据流 实线箭头:读/写数据路径 虚线箭头:监控控制流 信任链路 AUTH + TLS 加密