缓存契约版本Redis领域建模与架构设计 - 第1节
1.1 缓存的定义与本质
缓存(Cache)是一种将数据存储在临时、高速存储介质中的技术,其核心目的是缩短数据访问路径,降低系统响应延迟。在计算机体系结构中,缓存无处不在:从 CPU 的 L1/L2/L3 缓存,到操作系统的页缓存,再到分布式系统中的 Redis、Memcached 等中间件,其本质都是用空间换时间。
缓存的核心公式: 缓存命中率 = 缓存返回有效数据的请求数 / 总请求数。命中率越高,系统整体延迟越低。
缓存并非数据库的替代品,而是位于应用与数据库之间的加速层。它存储的是数据库中的热点数据子集或计算密集型结果,而非全量数据。
1.2 缓存的核心作用
缓存并非万能银弹,但在以下四个场景中效果显著:
| 作用维度 | 具体效果 | 典型指标 |
|---|---|---|
| 降低延迟 | 内存访问延迟约 0.1µs,磁盘 I/O 约 10ms,差距达 10 万倍 | P99 延迟从 50ms → 2ms |
| 提升吞吐 | 单机 Redis 可达 10 万 QPS,MySQL 通常 1 万 QPS | 系统 QPS 提升 5~10 倍 |
| 保护数据库 | 缓存吸收 90% 以上读请求,减少数据库连接数 | 数据库 CPU 使用率下降 60% |
| 削峰填谷 | 秒杀、热点新闻等突发流量由缓存承接 | 抗住 10 倍峰值流量 |
架构经验: 缓存不是越厚越好。引入缓存会增加系统复杂度、一致性成本和运维负担。只有当数据库成为性能瓶颈,且业务允许一定程度的最终一致性时,才值得引入缓存层。
1.3 缓存与数据库的对比
理解缓存与数据库的差异,是正确设计缓存策略的前提。以下从六个关键维度进行对比:
| 对比维度 | 缓存(Redis 为例) | 数据库(MySQL 为例) |
|---|---|---|
| 存储介质 | 内存(DRAM) | 磁盘(SSD/HDD) |
| 数据模型 | Key-Value、List、Set、Hash 等 | 关系表、行、列、索引 |
| 读写性能 | 读 10 万+ QPS,写 5 万+ QPS | 读 1 万 QPS,写 5 千 QPS |
| 持久化 | RDB/AOF 持久化,但非强一致 | WAL + 事务,ACID 保证 |
| 查询能力 | 简单键查询、有限聚合 | 复杂 JOIN、子查询、事务 |
| 数据容量 | 受限于内存(GB ~ TB 级) | PB 级,可水平扩展 |
常见误区: 不要试图用缓存替代数据库。缓存的数据是易失的、非事务的、容量有限的。数据库才是数据的最终权威来源(Source of Truth),缓存只是加速副本。
1.4 缓存穿透 / 击穿 / 雪崩 —— 初步认识
这三个问题是缓存系统最常见的故障模式,被称为缓存三大灾难。理解它们的成因是后续章节设计防御策略的基础。
1.4.1 缓存穿透
定义: 查询一个根本不存在的数据,缓存和数据库中都没有,导致每次请求都穿透缓存直达数据库。
- 危害: 恶意攻击者利用不存在的 Key 发起大量请求,数据库压力骤增,可能直接宕机。
- 初步解法: 缓存空值(Null Object)、布隆过滤器(Bloom Filter)。
1.4.2 缓存击穿
定义: 一个热点 Key 在缓存中过期失效的瞬间,大量并发请求同时回源数据库,导致数据库负载飙升。
- 危害: 单个热点 Key 失效即可拖垮数据库,常见于秒杀商品、热搜榜单。
- 初步解法: 互斥锁(Mutex Key)、逻辑过期、永不过期 + 异步刷新。
1.4.3 缓存雪崩
定义: 大量缓存 Key 在同一时间集中过期失效,或缓存节点宕机,导致海量请求直接压向数据库。
- 危害: 范围最广、破坏性最强,可能导致整个服务链崩溃。
- 初步解法: 过期时间加随机值、缓存集群高可用(主从 + Sentinel/Cluster)、限流降级。
1.5 本章小结
- 缓存本质:临时高速存储,用空间换时间,位于应用与数据库之间。
- 核心作用:降低延迟、提升吞吐、保护数据库、削峰填谷。
- 与数据库关系:缓存是加速副本,数据库是权威源,二者互补而非替代。
- 三大灾难:穿透(不存在的数据)、击穿(热点 Key 过期并发)、雪崩(大面积同时失效)。