REST 查询缓存中的 Cache-Control
对于 REST 终结点,你可以通过 Cache-Control 请求标头来影响数据墙DBW如何使用其内部查询结果缓存。
IMPORTANT
如果运行时配置中已禁用缓存,这些指令会被忽略,查询将按正常方式执行。
支持的 Cache-Control 值
| 值 | 行为 |
|---|---|
no-cache | 强制数据墙DBW绕过 L1 和 L2 缓存,从数据库读取最新数据,并用新结果更新缓存。 |
no-store | 告诉数据墙DBW完全不要缓存该响应(既不写入 L1/L2,也不会尝试从缓存读取)。 |
行为说明
- 指令匹配不区分大小写。
- 数据墙DBW不会解释其他标准
Cache-Control指令,例如max-age或max-stale。 - 仅适用于 REST 查询操作。不用于 GraphQL 请求级缓存指令。
Cache-Control请求头会同时影响 L1 和 L2 缓存。
NOTE
数据墙DBW在任何缓存操作中都不会主动设置 cache-control 响应头。
指令:no-cache
强制执行一次全新的读取,并更新缓存层。
请求
http
GET /api/Books
Cache-Control: no-cache
Accept: application/json响应(示例)
http
HTTP/1.1 200 OK
Content-Type: application/json
[
{ "id": 1, "title": "The Hobbit" },
{ "id": 2, "title": "The Silmarillion" }
]效果:缓存现在会保存这份最新结果(受已配置 TTL 约束)。
指令:no-store
如果缓存中已有值,则使用现有缓存值;否则查询数据库,但不会把新结果写入或刷新到缓存中。
请求
http
GET /api/Books
Cache-Control: no-store
Accept: application/json响应(示例)
http
HTTP/1.1 200 OK
Content-Type: application/json
[
{ "id": 1, "title": "The Hobbit" },
{ "id": 2, "title": "The Silmarillion" }
]效果:如果这份结果此前并未进入缓存,本次也不会被写入缓存。之后的 only-if-cached 请求如果之前没有其他请求把结果写入缓存,就可能失败。
回顾
- 当你需要强制从数据库刷新数据,并同时更新缓存时,请使用
no-cache。 - 当你想拿到数据,但不希望这次响应改变缓存状态时,请使用
no-store(但它仍然可能读取已有缓存值)。 - 不设置该标头时,使用默认缓存行为。
