Skip to content

HTTP 缓存头

对于 REST 查询请求,客户端可以通过 Cache-Control 请求头来影响数据墙DBW 的缓存行为。这允许调用方在特定场景下强制绕过缓存获取最新数据,或阻止某些响应进入缓存。

NOTE

如果运行时配置中全局缓存已关闭(runtime.cache.enabled: false),Cache-Control 请求头被完全忽略,所有查询正常访问数据库。

支持的指令

数据墙DBW 仅处理 Cache-Control 请求头中的以下指令:

指令行为
no-cache绕过 L1 和 L2 缓存,强制从数据库查询最新数据,并将结果更新到缓存中
no-store如果缓存中已有有效条目则返回缓存值;如果缓存未命中则查询数据库,但不会将结果写入 L1 或 L2

NOTE

数据墙DBW 不会在响应中主动设置 Cache-Control 响应头。缓存控制仅通过请求头单向驱动。指令匹配不区分大小写(NO-CACHEno-cache 效果相同)。不处理其他标准 Cache-Control 指令如 max-agemax-stalepublicprivate

no-cache:强制刷新

no-cache 的语义是"服务端应该在使用缓存前先验证"。在数据墙DBW 的实现中,它的效果是完全绕过缓存,强制从数据库读取,并将新结果写入缓存

请求

http
GET /api/Books
Cache-Control: no-cache
Accept: application/json

行为流程

text
请求带 no-cache → 跳过 L1 → 跳过 L2 → 查询数据库 → 结果写入 L2 → 结果写入 L1 → 返回

使用场景

场景说明
数据刚被外部系统修改数据墙DBW 之外的进程直接修改了数据库,缓存中的数据已过时
调试排查确认数据是否是缓存问题,强制看数据库真实值
实时性要求高的个别请求绝大部分请求走缓存,关键请求绕过

使用 no-cache 后,缓存被更新为最新数据,后续不带该头的请求会命中更新后的缓存。

no-store:不写入缓存

no-store 的效果是不改变缓存状态。数据墙DBW 在收到 no-store 时:

  • 如果缓存中已有有效条目,正常返回缓存值。
  • 如果缓存未命中,则查询数据库并返回结果,但不会将结果写入 L1 或 L2

请求

http
GET /api/Books
Cache-Control: no-store
Accept: application/json

行为流程

text
请求带 no-store → 检查 L1 → 检查 L2
  ├── 任一命中 → 返回缓存值(不更新缓存)
  └── 全部未命中 → 查询数据库 → 返回(不写入 L1 和 L2)

使用场景

场景说明
不频繁的一次性查询不希望这种临时查询占用缓存空间,驱逐热数据
敏感数据请求不希望查询结果留在可能被其他请求读取的缓存中
全量导出一次性的 $first=-1 全量数据拉取不应污染缓存

no-cache 与 no-store 对比

维度no-cacheno-store
是否走缓存读否,强制数据库可能走(如果已有缓存)
是否写缓存是,用新结果更新否,不写入
缓存后续影响后续请求受益于新缓存对缓存无影响
典型用途强制刷新避免污染缓存

组合使用

可以同时发送两个指令:

http
GET /api/Books
Cache-Control: no-cache, no-store

效果:强制数据库查询,且不将结果写入缓存。适合在排查问题时使用,既保证拿到最新数据,又不影响生产缓存。

限制

限制说明
仅 RESTGraphQL 请求不支持 Cache-Control 头控制缓存
仅查询仅影响 GET 请求,对其他 HTTP 方法无缓存行为
仅控制读取路径写操作(POST/PUT/PATCH/DELETE)的缓存失效行为不受影响
无响应头引擎不在响应中设置任何 Cache-Control 相关响应头

下一步

数据墙DBW 产品文档与开发指南。