2. 缓存基础回顾:缓存工作原理、常见缓存策略与异常场景
在深入 OpenAPI 场景下的缓存一致性之前,必须牢固掌握缓存的核心机制。本章将系统回顾缓存的工作原理、三大经典淘汰策略(LRU、LFU、TTL),以及分布式系统中极易出现的缓存穿透、击穿、雪崩问题。这些基础概念是后续讨论服务边界划分与数据传输优化的理论基石。
2.1 缓存工作原理
缓存的核心思想是空间换时间:将频繁访问的数据存储在读写速度更快的存储介质(如内存)中,减少对后端慢速存储(如数据库、磁盘)的直接请求。一个典型的缓存工作流包含以下步骤:
- 读请求到达:客户端请求数据 Key。
- 缓存查询:首先查询缓存层(如 Redis、Memcached)。
- 缓存命中:若缓存中存在该 Key,直接返回数据,流程结束。
- 缓存未命中:若缓存中不存在,则查询后端数据库。
- 数据回填:将数据库查询结果写入缓存,并设置过期时间(TTL)。
- 返回数据:将数据返回给客户端。
关键指标:缓存命中率 = 缓存命中次数 / (缓存命中次数 + 缓存未命中次数)。命中率越高,系统性能越好。业界优秀水平通常要求核心链路命中率 > 95%。
2.2 常见缓存淘汰策略
当缓存空间不足时,需要按照特定规则淘汰旧数据。以下是三种最经典的淘汰策略:
| 策略 | 全称 | 核心逻辑 | 适用场景 | 典型实现 |
|---|---|---|---|---|
| LRU | Least Recently Used | 淘汰最长时间未被访问的数据 | 数据访问具有时间局部性,如用户会话、API 响应缓存 | Redis allkeys-lru、volatile-lru |
| LFU | Least Frequently Used | 淘汰访问频率最低的数据 | 数据访问频率差异大,如热点新闻、排行榜 | Redis allkeys-lfu、volatile-lfu(Redis 4.0+) |
| TTL | Time To Live | 淘汰已过期的数据(非主动淘汰,而是被动过期) | 数据有时效性,如验证码、临时令牌 | Redis EXPIRE、TTL 命令 |
实践建议:在 OpenAPI 网关层,推荐使用 LRU + TTL 组合策略。LRU 保证热点数据常驻缓存,TTL 防止数据长期不更新导致的一致性问题。LFU 在流量突发场景下可能因历史频率过高而无法及时淘汰冷数据,需谨慎使用。
2.3 缓存异常场景:穿透、击穿、雪崩
这三个问题是分布式缓存中最常见的故障模式,理解其成因与解决方案是保障系统稳定性的前提。
2.3.1 缓存穿透
定义:请求查询一个缓存和数据库中都不存在的数据。由于缓存未命中,每次请求都会穿透到数据库,导致数据库压力剧增,甚至被打垮。
- 典型场景:恶意攻击者伪造大量不存在的 Key(如负 ID、特殊字符)发起请求。
- 解决方案:
- 缓存空对象:将查询结果为 null 的 Key 也缓存起来,设置较短的 TTL(如 30-60 秒)。
- 布隆过滤器:在缓存前加一层布隆过滤器,快速判断 Key 是否可能存在。若不存在,直接拒绝请求。
2.3.2 缓存击穿
定义:一个热点 Key 在缓存过期的一瞬间,大量并发请求同时涌入,全部穿透到数据库。
- 典型场景:秒杀商品的库存 Key、爆款文章的阅读量 Key。
- 解决方案:
- 互斥锁(Mutex):只允许一个线程去数据库加载数据,其他线程等待或重试。
- 逻辑过期:不设置物理 TTL,而是在 Value 中存储逻辑过期时间,由后台异步线程更新缓存。
- 热点数据永不过期:结合后台定时刷新机制,保证热点 Key 始终有效。
2.3.3 缓存雪崩
定义:大量缓存 Key 在同一时间集中过期,或者缓存节点整体宕机,导致所有请求直接打到数据库,引发连锁故障。
- 典型场景:所有缓存 Key 设置了相同的 TTL(如 1 小时整点过期);Redis 集群主节点宕机。
- 解决方案:
- 过期时间加随机值:在基础 TTL 上增加 ±10%~20% 的随机偏移,避免集中过期。
- 多级缓存:本地缓存(如 Caffeine)+ 分布式缓存(如 Redis)组合,降低单点故障影响。
- 缓存高可用:部署 Redis 哨兵或集群模式,实现自动故障转移。
- 限流降级:在数据库层配置限流,超出阈值时直接返回降级数据或错误提示。
重要提示:在 OpenAPI 场景中,缓存穿透和击穿是最常见的线上事故原因。建议在 API 网关层统一配置布隆过滤器(穿透防护)和热点 Key 检测(击穿防护),而不是让每个微服务单独处理。这体现了“服务边界”的划分原则——缓存防护是基础设施能力,不应分散到业务代码中。
2.4 本章小结
缓存是提升系统性能的核心手段,但必须理解其工作原理和潜在风险。LRU、LFU、TTL 三种策略各有适用场景,实际工程中常组合使用。缓存穿透、击穿、雪崩是分布式系统必须面对的三大挑战,需要从架构层面(布隆过滤器、多级缓存、限流降级)和代码层面(互斥锁、逻辑过期)共同防御。掌握这些基础,才能进一步讨论 OpenAPI 场景下的缓存一致性问题。