跳转到内容
搜索文档

缓存

最后更新 查看 MarkdownAgent 设置

背景

Cache API 可精细控制从 Cloudflare 全球网络 缓存中读取和写入。

Cache API 在全球范围内可用,但缓存内容不会在源数据中心之外复制。GET /users 响应可以在源数据中心缓存,但除非显式创建,否则不会存在于其他数据中心。

部署到自定义域名的 Worker 可使用完整的 cache 操作。Pages functions 同样如此,无论绑定到自定义域名还是 *.pages.dev 域名。

但在 Cloudflare Workers 仪表板编辑器和 Playground 预览中,任何 Cache API 操作都不会生效。对于由 Cloudflare Access 前置的 Worker,Cache API 目前不可用。


访问 Cache

caches.default API 深受 Web 浏览器 Cache API 的影响,但存在一些重要差异。例如,Cloudflare Workers 运行时公开单个全局 cache 对象。

let cache = caches.default;
await cache.match(request);

您可以通过 caches.open 方法创建和管理其他 Cache 实例。

let myCache = await caches.open('custom:cache');
await myCache.match(request);

Headers

我们的 Cache API 实现会尊重传递给 put() 的响应上的以下 HTTP 标头:

  • Cache-Control
  • Cache-Tag
    • 允许后续按标签清除资源。
  • ETag
    • 允许 cache.match() 使用 If-None-Match 评估条件请求。
  • Expires string
    • 指定资源何时失效的字符串。
  • Last-Modified
    • 允许 cache.match() 使用 If-Modified-Since 评估条件请求。

这与 Web 浏览器 Cache API 不同,后者不会尊重请求或响应上的任何标头。


方法

Put

cache.put(request, response);
  • put(request, response) : Promise

    • 尝试将响应添加到缓存,使用给定请求作为键。返回一个 promise,无论缓存是否成功存储响应,都会 resolve 为 undefined

参数

  • request string | Request

    • 用作键的字符串或 Request 对象。如果传入字符串,则将其解释为新建 Request 对象的 URL。
  • response Response

    • 要在给定键下存储的 Response 对象。

无效参数

在以下情况下,cache.put 会抛出错误:

  • 传入的 request 使用的不是 GET 方法。
  • 传入的 responsestatus206 Partial Content
  • 传入的 response 包含标头 Vary: *Vary 标头的值为星号(*)。更多信息请参阅 Cache API 规范

错误

如果 Cache-Control 指示不缓存,或响应过大,cache.put 会返回 413 错误。

Match

cache.match(request, options);
  • match(request, options) : Promise<Response | undefined>

    • 返回一个 promise,包装与该请求关联的响应对象。

参数

  • request string | Request

    • 用作查找键的字符串或 Request 对象。字符串会被解释为新建 Request 对象的 URL。
  • options

    • 可包含一个属性:ignoreMethod(Boolean)。当为 true 时,无论实际值如何,请求都被视为 GET 请求。

与浏览器 Cache API 不同,Cloudflare Workers 不支持 match() 上的 ignoreSearchignoreVary 选项。您可以在 put() 时移除查询字符串或 HTTP 标头来实现此行为。

我们的 Cache API 实现会尊重传递给 match() 的请求上的以下 HTTP 标头:

  • Range

    • 如果找到带有 Content-Length 标头的匹配响应,则返回 206 响应。您的 Cloudflare 缓存始终尊重范围请求,即使响应上有 Accept-Ranges 标头。
  • If-Modified-Since

    • 如果找到匹配响应,且 Last-Modified 标头的值早于 If-Modified-Since 指定的时间,则返回 304 响应。
  • If-None-Match

    • 如果找到匹配响应,且 ETag 标头的值与 If-None-Match 中的值匹配,则返回 304 响应。

错误

当请求的内容缺失或过期时,cache.match 会生成 504 错误响应。Cache API 不会直接向 Worker 脚本暴露此 504,而是返回 undefined。不过,底层 504 仍可在 Cloudflare Logs 中看到。

如果您使用 Cloudflare Logs,可能会看到 RequestSourceedgeWorkerCacheAPI504 响应。同样,如果缓存资源缺失或过期,这些响应是预期的。请注意,edgeWorkerCacheAPI 请求已在其他视图(如 Cache Analytics)中过滤。要过滤这些请求,或仅过滤您网站最终用户的请求,请参阅 过滤最终用户

Delete

cache.delete(request, options);
  • delete(request, options) : Promise<boolean>

从缓存中删除 Response 对象,并返回 Boolean 响应的 Promise

  • true:响应已缓存但现已删除
  • false:删除时响应不在缓存中。

参数

  • request string | Request

    • 用作查找键的字符串或 Request 对象。字符串会被解释为新建 Request 对象的 URL。
  • options object

    • 可包含一个属性:ignoreMethod(Boolean)。无论实际值如何,都将请求方法视为 GET。

相关资源

这篇文档对您有帮助吗?