1. 缓存基础概念:缓存的定义、作用与三大风险初步认识
1.1 缓存的定义与本质
缓存(Cache)是将数据存储在临时、高速的存储介质中,以便后续请求能够更快地获取该数据的技术手段。其核心思想是“用空间换时间”——利用有限的、昂贵的快速存储资源,减少对较慢、较昂贵的后端系统(如数据库、磁盘、远程服务)的访问次数。
缓存本质公式: 缓存命中率 × 快速存储访问速度 + (1 - 缓存命中率) × 原始数据源访问速度 > 原始数据源访问速度
从系统架构视角看,缓存位于数据消费者与数据生产者之间,扮演着“中间加速层”的角色。常见的缓存层级包括:CPU 多级缓存、进程内缓存(如 Guava Cache)、分布式缓存(如 Redis、Memcached)、CDN 缓存、浏览器缓存等。
1.2 缓存的核心作用
| 作用维度 | 具体描述 | 典型收益 |
|---|---|---|
| 降低延迟 | 将热点数据存储在内存中,避免磁盘 I/O 或网络 RPC | 响应时间从 100ms 级降至 1ms 级 |
| 提升吞吐量 | 缓存层可承载大量读请求,减轻后端数据库压力 | QPS 从 1k 提升至 10k+ |
| 保护后端 | 过滤重复查询、削峰填谷,防止数据库被打满 | 数据库连接数降低 80% 以上 |
| 成本优化 | 减少对昂贵计算资源或高 IOPS 存储的依赖 | 硬件投入与运维成本下降 |
架构师视角: 缓存不是银弹。引入缓存意味着系统复杂度增加——需要处理数据一致性、失效策略、内存管理、缓存穿透等问题。在决定使用缓存前,务必评估业务场景的“读多写少”程度与数据一致性容忍度。
1.3 缓存穿透、击穿、雪崩的初步认识
这三个概念是缓存失效场景中最常见、破坏力最大的三类问题。理解它们的本质区别是后续失效策略调优的基础。
| 问题 | 触发场景 | 核心原因 | 影响范围 |
|---|---|---|---|
| 缓存穿透 | 请求查询一个根本不存在的数据 | 缓存和数据库都没有该数据,每次请求都穿透到数据库 | 恶意攻击或错误查询导致数据库压力激增 |
| 缓存击穿 | 一个热点 key 在缓存失效的瞬间,大量并发请求涌入 | 热点 key 过期后,所有请求同时回源数据库 | 单个热点 key 失效导致数据库瞬间高负载 |
| 缓存雪崩 | 大量缓存 key 在同一时间集中失效 | 缓存设置相同的过期时间,或缓存节点宕机 | 数据库被海量请求打垮,引发级联故障 |
1.4 三类问题的初步应对思路
注意: 以下仅为初步认识阶段的应对方向,后续章节将深入讲解每种策略的调优细节与 trade-off。
- 缓存穿透应对:
- 缓存空对象:将不存在的数据也缓存起来(短 TTL)
- 布隆过滤器:在缓存前加一层概率性过滤器,快速判断 key 是否存在
- 参数校验:在入口层拦截明显不合法的查询
- 缓存击穿应对:
- 互斥锁(Mutex):只允许一个线程回源查询,其他线程等待
- 热点 key 永不过期 + 异步更新:逻辑过期而非物理过期
- 二级缓存:本地缓存 + 分布式缓存组合
- 缓存雪崩应对:
- 过期时间随机化:避免大量 key 同时过期
- 缓存高可用:Redis 哨兵/集群模式,避免单点故障
- 限流降级:在数据库层做保护,防止被突发流量打垮
核心认知: 穿透、击穿、雪崩虽然都表现为“缓存失效导致数据库压力增大”,但它们的触发条件和影响范围截然不同。穿透是“数据不存在”,击穿是“单个热点 key 失效”,雪崩是“大量 key 同时失效”。失效策略调优的核心目标之一,就是针对这三种场景设计差异化的防御机制。