跳转到内容
搜索文档

限制

最后更新 查看 MarkdownAgent 设置

本页列出不适用 Workers 缓存的场景,并说明它与你可能已在使用的其他缓存之间的关系。

不支持的场景

HTTP 方法

GETHEAD 请求会被缓存。POSTPUTPATCHDELETE 及其他方法始终会调用 Worker。

同一 URL 的 GETHEAD 共享单个缓存条目。在冷缓存上到达的 HEAD 请求会在内部转换为 GET,以便用完整资源填充缓存。请参阅缓存键

如需缓存非幂等请求的响应,请在 Worker 中显式处理——例如,将请求体哈希为合成 URL,并发起内部 GET 子请求。

WebSocket 升级

WebSocket 升级请求(带 Upgrade: websocketGET)会绕过缓存,始终调用 Worker。WebSocket 会话本质上有状态,不适合作为缓存单元。

自定义 RPC 方法

WorkerEntrypoint 上的 fetch() 调用会经过 Workers 缓存。像 ctx.exports.Backend.getUser(id) 这样的自定义 RPC 方法会绕过缓存,始终运行被调用方,无论 entrypoint 的 cache.enabled 设置如何。

如需缓存当前以 RPC 方法暴露的工作,请将其重构为独立 entrypoint 上的 fetch 处理程序,并通过 fetch() 调用。

永不缓存的状态码

Workers 缓存永不存储以下响应,即使带有显式 Cache-Control 指令:

  • 520526(Cloudflare 故障保护响应)被视为瞬时错误,始终重新运行 Worker。
  • Worker 返回的 206 Partial Content 不会被存储——Workers 缓存期望 Worker 返回完整的 200 响应,并自行进行范围切片。请参阅Range 请求了解支持的模式。

其他调用类型

Workers 缓存仅适用于 Worker entrypointfetch 处理程序处理的 HTTP 请求。以下调用类型始终运行,不涉及缓存:

按主机清除

没有「按主机清除」模式。缓存属于 Worker,而非域名——主机不是缓存键的一部分,因此按主机清除无法映射到缓存实际存储的内容。请改用按标签清除按路径前缀清除purgeEverything

缓存预热

没有 API 可以在构建时用生成的响应预填充缓存。响应只有在至少被提供一次后才会被缓存。如需让预渲染内容对第一个请求者可用,请使用静态资源(Static Assets)

限制

响应大小

响应大小限制与 Cloudflare zone 缓存相同。各套餐限制请参阅可缓存大小限制

Cache-Tag 限制

Cache-Tag 值的数量、长度和字符集限制与 Cloudflare zone 缓存相同。完整列表请参阅缓存标签限制

清除速率限制

ctx.cache.purge() 使用与 zone 清除 API 相同的速率限制系统。账户适用速率请参阅可用性与限制

与其他缓存的关系

Zone 级缓存配置

Workers 缓存是你的 Worker 的缓存,而非 zone 的缓存。它以 Worker 本身作为配置面,因此无需额外配置规则或设置。以下均不适用于 Workers Caching:

Zone 级功能 Workers 缓存中的等效做法
Cache RulesCache Response Rules 在 Worker 中设置 Cache-Control 标头,或根据请求分支并返回不同标头。
Cache Rules 中的缓存键自定义 Workers 缓存有自身的键组成;请参阅缓存键。通过改写请求来塑造键(例如,在网关 Worker 中改写 URL 或设置 ctx.props)。
Zone 级缓存级别设置(bypass / standard / aggressive / ignore query string) 响应上的 Cache-Control 标头在每次请求级别表达相同意图。
Zone 的默认 cached-file-extensions 列表 Workers 缓存会缓存标头表明可缓存的任何响应,与文件扩展名无关。
自定义分层缓存拓扑 Workers 缓存默认使用通用分层缓存拓扑。Worker 可在任意位置执行,固定自定义拓扑不适用——未来与 Smart Placement 的集成可能进一步定制分层。
在缓存前修改请求或响应的 Rulesets 在 Worker 代码中于返回前转换请求或响应。

要影响 Worker 的缓存,请修改 Worker。Cache-Control 标头、ctx.props、service binding 组合和 ctx.cache.purge() 覆盖配置面。

Cache API(caches.default

Cache API 是独立的编程式缓存存储。它与 Workers 缓存无关——对一方的操作不影响另一方,ctx.cache.purge() 才会使 Workers 缓存条目失效。

对于新 Worker,优先使用 Workers 缓存。Cache API 设计上是一个更低层的原语:

  • 它不读穿——响应仅在 Worker 显式调用 put() 时缓存,每个请求在进入时仍会执行 Worker。
  • 它不会为同一资源合并并发请求。突发流量访问新 URL 会为每个请求调用一次 Worker。
  • 它不参与分层缓存

Workers 缓存自动提供以上三项。当你需要细粒度编程控制时,Cache API 仍然有用。

fetch() 子请求缓存

Workers 缓存是位于 Worker 前面的服务端缓存。它与 Worker 向自身源站发起的出站 fetch() 子请求前面的缓存是分开的。两者独立运行:fetch() 子请求命中可省去访问源站的行程,而 Workers 缓存命中则 Worker 完全不必运行。

cf 属性在两者上的行为不同:

cf 属性 向源站的出站 fetch() ctx.exports.<Entrypoint>.fetch()
cf.cacheKey 支持 支持 — 请参阅自定义缓存键
cf.cacheControl 支持 支持 — 请参阅从调用 Worker 覆盖 Cache-Control
cf.cacheTtl 支持 不支持 — 通过被调用方返回 Cache-Control: max-age=N(或 s-maxage=N)设置 TTL,或从调用方用 cf.cacheControl 覆盖
cf.cacheEverything 支持 不支持 — Workers 缓存根据响应的 Cache-Control 决定可缓存性;无法强制缓存本不可缓存的响应

即将推出

以下功能正在开发中:

  • 无需 Wrangler 即可启用缓存的仪表板 UI
  • Workers Observability 中的缓存分析

这篇文档对您有帮助吗?