了解缓存密钥 - Amazon CloudFront
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

了解缓存密钥

TheThethe 缓存密钥 确定查看器请求是否向A CloudFront 边缘位置结果为 缓存命中. 缓存密钥是缓存中对象的唯一标识符。缓存中的每个对象都有唯一的缓存密钥。

当查看器请求与先前请求生成同一个缓存密钥时,会发生缓存命中,该缓存密钥的对象位于Edge位置缓存并有效。当缓存命中时,请求的对象将从一个来自一个来自一个的查看器的查看器中提供 CloudFront 边缘位置,具有以下优势:

  • 减少原始服务器上的负载

  • 减少查看器延迟

您可以在更高的时间内从网站或应用程序获得更好的性能 缓存命中率 (导致缓存命中的查看器请求比例)。改善缓存命中率的一种方法是仅包括缓存密钥中的最小必要值。有关更多信息,请参阅以下部分。

您可以使用A在缓存密钥中修改值(URL查询字符串、HTTP头和cookies) 缓存策略. (也可以使用A修改缓存密钥 λ@Edge功能.)在修改缓存密钥之前,要了解应用程序如何设计以及如何根据查看器请求的特征来提供不同的响应时间以及如何使用不同的响应。当查看器请求中的值确定您的原始回报的回复时,应该在缓存密钥中包含该值。但如果在缓存密钥中包含不影响原始回复响应的值,则可能会终止缓存重复对象。

默认缓存密钥

默认情况下,缓存密钥为 CloudFront 分销包括以下信息:

  • CloudFront 分配的域名,例如 d111111abcdef8.cloudfront.net。

  • 请求对象的URL路径(例如, /content/stories/example-story.html)

默认情况下,查看器请求中的其他值不包含在缓存密钥中。请从Web浏览器考虑以下HTTP请求。

GET /content/stories/example-story.html?ref=0123abc&split-pages=false HTTP/1.1 Host: d111111abcdef8.cloudfront.net User-Agent: Mozilla/5.0 Gecko/20100101 Firefox/68.0 Accept: text/html,*/* Accept-Language: en-US,en Cookie: session_id=01234abcd Referer: https://news.example.com/

当一个查看器请求的一个问题时,这个请求会进入 CloudFront 边缘位置, CloudFront 使用缓存密钥确定是否存在缓存命令。默认情况下,缓存密钥中只包含粗体显示的信息。如果请求的对象不在缓存中(缓存错误),则 CloudFront 发送请求到原点,以获取对象。在获得对象后, CloudFront 将其返回到查看器并将其存储在边缘位置缓存中。

当WhenWhen CloudFront 接收同一对象的另一个请求,由缓存密钥确定, CloudFront 立即将缓存对象提供给查看器,而不会向原始发起人发送请求。例如,考虑以下请求之后的HTTP请求。

GET /content/stories/example-story.html?ref=xyz987&split-pages=true HTTP/1.1 Host: d111111abcdef8.cloudfront.net User-Agent: Mozilla/5.0 AppleWebKit/537.36 Chrome/83.0.4103.116 Accept: text/html,*/* Accept-Language: en-US,en Cookie: session_id=wxyz9876 Referer: https://rss.news.example.net/

此请求与之前请求的对象相同,但与之前的请求不同。它有不同的URL查询字符串,不同的 User-AgentReferer 标题,以及不同的 session_id cookie。但是,默认情况下,这些值都不是缓存密钥的一部分,因此这第二个请求会导致缓存命中中断。

自定义缓存密钥

在某些情况下,您可能希望在缓存密钥中添加更多信息,即使这样做可能导致缓存命中率更少。您可以使用 缓存策略.

例如,如果您的原始服务器使用 Accept-Language 查看器中的HTTP标头要根据查看器语言返回不同内容,您可能希望在缓存密钥中添加此标头。当你这么做时 CloudFront 使用此标题确定缓存命令,并包括标题 起始请求 (请求 CloudFront 在存在缓存错误时发送至原点)。

在缓存密钥中包括其他值的潜在后果是 CloudFront 可能会因为查看器请求中可能发生的变化而终止缓存重复对象。例如,查看器可能会发送以下任意值 Accept-Language 标题:

  • en-US,en

  • en,en-US

  • en-US, en

  • en-US

所有这些不同的值表示查看器语言为英语,但是变化可能导致 CloudFront 多次缓存同一个对象。这可以减少缓存命中并增加原始请求的数量。您可以避免这种复制措施,而不是 Accept-Language 缓存密钥中的标题,而是配置您的网站或应用程序以使用不同语言的不同URL(例如, /en-US/content/stories/example-story.html)。

对于要在缓存密钥中添加的任何给定值,您应确保了解查看器请求中该值的不同变化可能会出现多少种不同的变化。对于某些请求值,在缓存密钥中将其纳入到这些值中很少有意义。例如, User-Agent 标题可以有数千个独特的变化,因此一般不是适合于缓存密钥中的应聘者。具有用户特定或会话特定值的Cookie,并且在数千个(甚至数百万个)请求中的独特性也不适合缓存关键包容性。如果在缓存密钥中包含这些值,则每个唯一的变化都会导致缓存中对象的另一副本。如果对象的这些拷贝不是唯一的,或者如果您的这些大量不同的对象只会获得少量的缓存命令,那么您可能想考虑一个不同的方法。您可以从缓存密钥排除这些高度变量值,或者将对象标记为不可缓存。

自定义缓存密钥时请谨慎。有时候需要,但它可能会产生意外的后果,例如缓存重复对象、降低缓存命中率、以及增加原始请求数量。如果您的原始网站或应用程序需要从查看器的分析、遥测或其他用途的查看器请求接收某些值,但这些值不会改变原始回报的对象,使用 起运地请求政策 在起始请求中包括这些值 不是 将其包括在缓存密钥中。