2. 缓存基础回顾:缓存工作原理、常见缓存策略与异常场景

在深入 OpenAPI 场景下的缓存一致性之前,必须牢固掌握缓存的核心机制。本章将系统回顾缓存的工作原理、三大经典淘汰策略(LRU、LFU、TTL),以及分布式系统中极易出现的缓存穿透、击穿、雪崩问题。这些基础概念是后续讨论服务边界划分与数据传输优化的理论基石。

2.1 缓存工作原理

缓存的核心思想是空间换时间:将频繁访问的数据存储在读写速度更快的存储介质(如内存)中,减少对后端慢速存储(如数据库、磁盘)的直接请求。一个典型的缓存工作流包含以下步骤:

  1. 读请求到达:客户端请求数据 Key。
  2. 缓存查询:首先查询缓存层(如 Redis、Memcached)。
  3. 缓存命中:若缓存中存在该 Key,直接返回数据,流程结束。
  4. 缓存未命中:若缓存中不存在,则查询后端数据库。
  5. 数据回填:将数据库查询结果写入缓存,并设置过期时间(TTL)。
  6. 返回数据:将数据返回给客户端。
关键指标:缓存命中率 = 缓存命中次数 / (缓存命中次数 + 缓存未命中次数)。命中率越高,系统性能越好。业界优秀水平通常要求核心链路命中率 > 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 哨兵或集群模式,实现自动故障转移。
    • 限流降级:在数据库层配置限流,超出阈值时直接返回降级数据或错误提示。
缓存穿透/击穿/雪崩对比图 三大缓存异常场景对比 缓存穿透 请求不存在的数据 缓存 & 数据库均无 每次穿透到数据库 缓存击穿 热点 Key 过期瞬间 大量并发请求涌入 全部打到数据库 缓存雪崩 大量 Key 集中过期 或缓存节点宕机 数据库瞬间崩溃 解决方案 穿透:空对象缓存 / 布隆过滤器 击穿:互斥锁 / 逻辑过期 / 热点永不过期 雪崩:TTL 随机化 / 多级缓存 / 高可用 核心原则:避免请求直接穿透到数据库,保障后端存储安全
重要提示:在 OpenAPI 场景中,缓存穿透和击穿是最常见的线上事故原因。建议在 API 网关层统一配置布隆过滤器(穿透防护)和热点 Key 检测(击穿防护),而不是让每个微服务单独处理。这体现了“服务边界”的划分原则——缓存防护是基础设施能力,不应分散到业务代码中。

2.4 本章小结

缓存是提升系统性能的核心手段,但必须理解其工作原理和潜在风险。LRU、LFU、TTL 三种策略各有适用场景,实际工程中常组合使用。缓存穿透、击穿、雪崩是分布式系统必须面对的三大挑战,需要从架构层面(布隆过滤器、多级缓存、限流降级)和代码层面(互斥锁、逻辑过期)共同防御。掌握这些基础,才能进一步讨论 OpenAPI 场景下的缓存一致性问题。