全书目录

第十六篇:GraphQL 完全指南 —— 智能问询总台宇宙

第十二章:缓存认知 —— 总台也要有档案柜,但别把缓存想简单了

1 分钟 389 字 第 316 / 962 个阅读单元

很多人一听 GraphQL,就说“它不好缓存”。
这话只说对了一半。

正确理解是:

GraphQL 不是不能缓存,而是缓存层次和 REST 不一样。

先分三层看。

第一层:传输层缓存

如果 Query 支持 GET,再配合持久化查询或哈希查询,就可以走浏览器/CDN 的缓存思路。

text
Query -> 可选 GET -> 可做 HTTP/CDN 缓存
Mutation -> 一般还是 POST -> 不适合这样缓存

第二层:客户端对象缓存

GraphQL 客户端更常见的是“按对象归档”,而不是按整页 URL 归档。
这时全局唯一 id 很重要。

例如:

graphql
type Resident {
  id: ID!
  name: String!
}

客户端就可以把它理解成:

text
缓存键 ≈ __typename + id
Resident:r-1001

这样不同查询里只要出现同一个对象,都能复用缓存、合并更新。

第三层:服务端/数据源缓存

这层包括:

  • DataLoader 的请求级缓存
  • 热门对象短时缓存
  • 底层数据库或服务自己的缓存

缓存认知图:

text
客户端组件
   ↓
GraphQL Query
   ↓
[传输层缓存]  GET / persisted query / CDN
   ↓
[客户端对象缓存] __typename + id
   ↓
[Resolver 请求级缓存] DataLoader
   ↓
[底层数据缓存] Redis / DB cache

你最该记住的不是“怎么背缓存术语”,而是下面这句:

GraphQL 的缓存重点,往往从“缓存整个接口响应”转向“缓存对象与字段关系”。