缓存失效操作概览

本页面概述了 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
  • 具有标记 img2020-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 跨项目服务引用的全球外部应用负载均衡器,则默认情况下,服务项目管理员没有请求缓存失效操作所需的权限。

只有具有在前端项目中配置负载均衡器资源的 Identity and Access Management (IAM) 角色(例如 Compute Network Admin 角色 [roles/compute.networkAdmin])的主账号才能发出缓存失效请求。

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

后续步骤