3. API Gateway 缓存场景分析:哪些 API 适合缓存,哪些不适合

在 API Gateway 中接入缓存中间件并非“一刀切”的策略。错误的缓存决策不仅浪费内存资源,还会导致数据不一致、用户看到过期信息等严重问题。本章从读写比例、数据一致性要求、数据时效性三个维度,系统梳理适合与不适合缓存的 API 场景,并给出缓存粒度的选择依据。

3.1 缓存适用性判断模型

判断一个 API 是否适合缓存,核心依据是以下三个维度的交叉评估:

评估维度 适合缓存的特征 不适合缓存的特征
读写比例 读远大于写(读多写少) 写频繁或读写均衡
数据一致性要求 最终一致性可接受,允许短暂过期 强一致性要求,必须实时最新
数据时效性 数据相对静态,变化频率低 实时数据、高频变化数据
实践原则: 当三个维度都指向“适合”时,缓存收益最大;只要有一个维度指向“不适合”,就需要谨慎评估缓存策略,或考虑使用更短 TTL、局部缓存等折中方案。

3.2 适合缓存的 API 场景

以下三类 API 是缓存中间件的最佳实践对象,缓存命中率通常可达到 70% 以上:

  • 基础数据查询类: 如商品分类列表、国家/地区代码、配置字典、静态标签。这些数据几乎不变,一次写入缓存后可长期复用。
  • 用户无关的聚合数据: 如首页推荐位、热门文章排行榜、公告信息。所有用户看到的内容相同,缓存一份即可服务所有请求。
  • 低频变化的业务数据: 如产品规格参数、门店营业时间、运费模板。数据变更频率以小时或天为单位,缓存 TTL 可设置为 5~30 分钟。
典型收益案例: 某电商网关对“商品分类树”API 启用缓存后,该接口平均响应时间从 120ms 降至 3ms,网关层 QPS 从 2000 提升至 15000,后端数据库查询量减少 98%。

3.3 不适合缓存的 API 场景

以下场景强行使用缓存会带来负面效果,应避免或采用特殊策略:

场景类型 原因 替代方案
实时数据接口(如股票行情、在线人数) 数据每秒都在变化,缓存永远过期 WebSocket 推送、SSE
写操作接口(如创建订单、提交评论) 写操作需要实时落库并返回最新状态 直接透传后端,不做缓存
用户私有数据(如个人资料、订单详情) 每个用户数据不同,缓存碎片化严重 本地缓存 + 用户 ID 分片,或不做缓存
强一致性业务(如库存扣减、支付状态) 缓存过期可能导致超卖或重复支付 数据库事务 + 分布式锁
常见误区: 不要为了“提升性能”而对所有 GET 接口都开启缓存。对于用户私有数据接口,即使加了缓存,由于每个用户的数据不同,缓存命中率极低,反而增加了缓存层的内存开销和失效维护成本。

3.4 缓存粒度选择:全响应缓存 vs 部分数据缓存

确定 API 适合缓存后,还需要选择缓存的粒度。粒度选择直接影响缓存效率、内存占用和失效复杂度。

缓存粒度决策流程 API 请求到达网关 响应数据是否可被所有用户复用? 全响应缓存(整页/整个 JSON) 部分数据缓存(仅缓存公共片段) 选择依据 全响应缓存:数据完全公共、响应体小、变更频率低 部分数据缓存:数据部分公共、响应体大、需个性化拼接

3.4.1 全响应缓存(Full Response Caching)

将整个 HTTP 响应(包括 Headers 和 Body)作为缓存键值存储。适用于:

  • 响应内容完全公共,不依赖用户身份或请求参数中的个性化信息
  • 响应体较小(通常 < 100KB)
  • 数据变更频率低,缓存失效策略简单
// 全响应缓存示例(基于网关路由配置)
GET /api/v1/categories
Cache-Control: public, max-age=300
X-Cache-Key: /api/v1/categories

// 缓存命中时直接返回完整响应,无需回源

3.4.2 部分数据缓存(Partial Data Caching)

仅缓存响应中的公共数据片段,个性化部分在网关层动态组装。适用于:

  • 响应中大部分数据是公共的,但有小部分用户个性化内容
  • 响应体较大(如 500KB+),全量缓存内存开销过高
  • 需要精细控制缓存失效范围,避免因小部分数据变化导致整个缓存失效
// 部分数据缓存示例(网关层模板组装)
// 1. 从缓存获取公共数据片段
GET cache://product/{id}/base_info  →  {"name":"...", "price":99.9, "images":[...]}

// 2. 从用户服务获取个性化数据
GET user://favorites?uid={userId}  →  {"is_favorited": true}

// 3. 网关层合并响应
{
  "product": <cached_base_info>,
  "user_status": <personalized_data>
}

3.5 缓存粒度对比总结

对比维度 全响应缓存 部分数据缓存
实现复杂度 低,网关直接缓存 HTTP 响应 高,需网关层做数据拆分与组装
内存效率 低,重复存储公共部分 高,公共数据只存一份
缓存命中率 高(数据完全公共时) 中(公共片段命中率高,但组装有开销)
失效粒度 粗,整个响应失效 细,仅失效变更的数据片段
适用场景 静态数据、配置、分类列表 商品详情页、用户首页 Feed
选型建议: 优先选择全响应缓存,因为实现简单、维护成本低。只有当全响应缓存导致内存浪费严重(如响应体 > 200KB 且公共部分占比 < 60%)或失效粒度太粗导致缓存频繁失效时,才考虑升级为部分数据缓存方案。

3.6 场景决策速查表

以下速查表帮助架构师快速判断常见 API 的缓存策略:

API 示例 读写比例 一致性要求 是否适合缓存 推荐粒度 建议 TTL
商品分类列表 99:1 低 ✅ 非常适合 全响应 10~30 分钟
用户订单列表 7:3 高 ❌ 不适合 — —
商品详情页 9:1 中 ✅ 适合 部分数据 1~5 分钟
实时股票行情 10:0 极高 ❌ 不适合 — —
系统配置字典 100:0 低 ✅ 非常适合 全响应 1~24 小时
用户收藏状态 5:5 高 ⚠️ 谨慎 部分数据 30 秒~1 分钟
核心原则: 缓存不是银弹。在 API Gateway 层做缓存决策时,始终以“数据是否可以被延迟接受”和“缓存收益是否大于维护成本”为判断基准。对于不确定的场景,先通过监控采集缓存命中率、回源率、平均响应时间等指标,用数据驱动决策。