缓存失效操作概览

本页面概述了 Cloud CDN 缓存失效操作。

什么是缓存失效操作?

对象被缓存后,它通常会保留在缓存中,直到对象过期或被逐出(以便为新内容腾出空间)。您可能希望在正常过期时间之前从缓存中移除对象。您可以通过发出缓存失效操作请求来强制缓存忽略一个对象或一组对象。

缓存失效(有时称为“缓存清除”)是指声明缓存内容无效的过程。此过程会导致相应条目从缓存中移除,然后在下次请求相应内容时从后端服务器重新填充。

Cloud CDN 支持使用缓存标记(预览)和失效匹配器(例如主机和网址路径)来发出失效请求。

您可以组合使用这些失效参数来定位特定的缓存响应,并尽可能减少后续缓存填充对后端的负载。

在发出此类请求之前,您必须确保后端服务器返回的是正确的内容。否则,当 Cloud CDN 再次请求内容时,它可能会缓存错误的内容。

失效请求的速率受限,如下所示:

  • 对于缓存代码(预览版),您每分钟最多可以提交 500 个失效请求。每个失效请求都会在大约 10 秒后生效。
  • 对于其他失效匹配器,您每分钟最多可以提交一次失效操作。每个失效请求大约需要 1 到 3 分钟才能生效。

对于每个请求,Cloud CDN 不会限制对象数量或所有失效对象的总大小。

通过网址失效

每个失效操作请求都会指定一个路径模式,用来标识应当失效的一个对象或一组对象。路径模式可以是具体路径(例如 /cat.jpg),也可以是整个目录结构(例如 /pictures/*)。路径模式需要遵循以下规则:

  • 路径模式必须以 / 开头。
  • 它不能包含 ?#
  • 它只能将 * 用作 / 之后的最后一个字符。
  • 如果以 /* 结尾,则前面的字符串是一个前缀,路径以该前缀开头的所有对象都将失效。

路径模式类似于网址的路径部分,后者是主机名与可能存在的 ?# 之间的所有内容。

如果您的网址包含查询字符串,例如 /images.php?image=fred.png,则您不能选择性地让只有查询字符串不同的对象中的一部分失效。例如,如果您有 /images.php?image=fred.png/images.php?image=barney.png 两张图片,则不能仅使 fred.png 失效。要使 images.php 传送的所有图片失效,请使用 /images.php 作为路径模式。

使单个主机失效

缓存失效操作会使所有主机名的相应路径失效。例如,如果您将 example.comexample2.com 指向同一负载平衡器,并且使 /images/cat.jpg 失效,则 example.com/images/cat.jpgexample2.com/images/cat.jpg 都将失效。

您可以在命令中添加 --host 标志,以将失效操作限制在一个主机的范围内。

通过缓存标记进行失效

借助缓存标记(或替代键),您可以根据任意元数据使内容失效。

这些代码段是在后端响应中使用 Cache-Tag HTTP 标头定义的。Cache-Tag HTTP 响应标头中来自后端的缓存标记会发送到客户端。

缓存代码存在以下限制:

  • 每个代码不得超过 120 字节
  • 每个缓存对象的标记名称总数不得超过 4 KiB(4096 字节)
  • 每个对象的标记不得超过 50 个

如果超出这些代码限制,系统不会缓存响应,并且会在 LoadBalancerLogEntry.cacheDecision 中将此决策记录为 RESPONSE_CACHE_TAG_INVALID

每个失效请求最多可以指定 10 个缓存标记。如果在单个失效请求中指定多个标记,系统会将它们视为逻辑 OR。请考虑以下示例,其中包含以下缓存对象:

  • 带有标记 js2020-12-23prod 的缓存对象 1
  • 带有标记 css2020-11-30prod 的缓存对象 2
  • 带有标记 img 2020-11-30staging 的缓存对象 3

当您发出请求以使与 tags="prod,2020-11-30" 匹配的对象失效时,所有三个缓存对象都会失效。这种方法意味着,当您想要使对象失效时,无需知道或指定所有可能的代码组合。

如果您同时指定失效匹配器和缓存标记,则失效请求仅适用于与失效匹配器匹配的标记对象。请考虑以下包含缓存对象的示例:

  • 网址为 https://staging.example.com/img/cat.jpg 且标记为 a 的缓存对象 1
  • 网址为 https://example.com/img/cat.jpg 且标记为 a 的缓存对象 2
  • 网址为 https://staging.example.com/js/cat.js 且标记为 a 的缓存对象 3
  • 网址为 https://staging.example.com/img/logo.jpg 且标记为 b 的缓存对象 4

当您发出请求以使与 --host="staging.example.com" --path="/img/*" --tags="a" 匹配的对象失效时,只有对象 1 会失效。对象 2、3 和 4 分别与主机、路径或代码不匹配。

失效延迟时间

由于 Cloud CDN 是一个分布式系统,因此,有时即使少量缓存尚未失效,Cloud CDN 也可能会报告失效操作已完成。这种情况非常罕见,并且系统会自动进行更正。

最佳做法

请仅对必要的内容执行失效操作,这是因为,如果让太多缓存内容失效,可能会导致之前由这些缓存处理的大量请求突然涌向您的实例或存储分区。

失效操作只应在特殊情况下使用,不应是您的正常工作流的一部分。失效操作不会影响 Web 浏览器缓存或第三方互联网服务提供商运行的缓存中的缓存副本。

作为常规失效方法的替代方案,您可以主动为响应设置适当的过期时间,或为不同版本的内容使用不同的网址。如需详细了解过期时间,请参阅过期时间和验证请求

使用共享 VPC 跨项目服务引用进行失效

缓存失效操作在前端项目(即包含转发规则、目标代理和负载平衡器的网址映射的项目)中进行配置。因此,如果您使用的是具有共享 VPC 跨项目服务引用的全局外部应用负载平衡器,则默认情况下,服务项目管理员没有请求缓存失效操作所需的权限。

只有具有身份和访问管理 (IAM) 角色的主账号(例如 Compute Network Admin 角色 [roles/compute.networkAdmin])才能发出缓存失效操作,以便在前端项目中配置负载平衡器资源。

在单独项目中控制后端服务预配的服务管理员可以与前端项目的负载平衡器管理员合作,为其跨项目服务发出缓存失效操作。对于网址重写,请确保失效操作与客户端发送的预重写主机和路径匹配。

后续步骤