很多人一听 GraphQL,就说“它不好缓存”。
这话只说对了一半。
正确理解是:
GraphQL 不是不能缓存,而是缓存层次和 REST 不一样。
先分三层看。
第一层:传输层缓存
如果 Query 支持 GET,再配合持久化查询或哈希查询,就可以走浏览器/CDN 的缓存思路。
Query -> 可选 GET -> 可做 HTTP/CDN 缓存
Mutation -> 一般还是 POST -> 不适合这样缓存第二层:客户端对象缓存
GraphQL 客户端更常见的是“按对象归档”,而不是按整页 URL 归档。
这时全局唯一 id 很重要。
例如:
type Resident {
id: ID!
name: String!
}客户端就可以把它理解成:
缓存键 ≈ __typename + id
Resident:r-1001这样不同查询里只要出现同一个对象,都能复用缓存、合并更新。
第三层:服务端/数据源缓存
这层包括:
- DataLoader 的请求级缓存
- 热门对象短时缓存
- 底层数据库或服务自己的缓存
缓存认知图:
客户端组件
↓
GraphQL Query
↓
[传输层缓存] GET / persisted query / CDN
↓
[客户端对象缓存] __typename + id
↓
[Resolver 请求级缓存] DataLoader
↓
[底层数据缓存] Redis / DB cache你最该记住的不是“怎么背缓存术语”,而是下面这句:
GraphQL 的缓存重点,往往从“缓存整个接口响应”转向“缓存对象与字段关系”。