瞭解快取金鑰 - Amazon CloudFront

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

瞭解快取金鑰

快取索引鍵可決定檢視器對 CloudFront 邊緣位置的要求是否會導致快取命中。快取金鑰是快取中物件的唯一識別碼。快取中的每個物件都有唯一的快取金鑰。

當檢視器請求產生與先前請求相同的快取金鑰,且該快取金鑰的物件位於節點的快取中且有效時,就會發生快取命中。當有快取命中時,要求的物件會從 CloudFront 邊緣位置提供給檢視者,這具有下列優點:

  • 降低原始伺服器的負載

  • 減少檢視器的延遲

當您的快取命中率 較高 (造成快取命中率較高的檢視器請求比例較高時),您可以從網站或應用程式獲得較佳的效能。改善快取命中率的一種方法是,只在快取金鑰中包含必要的最小值。如需詳細資訊,請參閱下列區段。

您可以使用快取政策來修改快取金鑰中的值 (URL 查詢字串、HTTP 標頭和 Cookie)。(您也可以使用 Lambda @Edge 函數修改快取金鑰)。在修改快取金鑰之前,請務必瞭解應用程式的設計方式,以及根據檢視器請求的特性提供不同的回應的時間和方式。當查看器請求中的值確定您的來源返回的回應時,您應該在快取金鑰中包含該值。但是,如果您在快取金鑰中包含一個不影響您來源返回的回應值,則最終可能會快取重複的物件。

預設快取金鑰

根據預設, CloudFront 散發的快取金鑰包含下列資訊:

  • CloudFront 發行版的網域名稱 (例如,網域名稱)

  • 請求物件的 URL 路徑 (例如 /content/stories/example-story.html)

注意

OPTIONS 方法中包含在 OPTIONS 請求的快取金鑰中。這表示,OPTIONS 請求的回应會與 GETHEAD 請求的回应分开快取。

依預設,來自檢視者請求的其他值不會包含在快取金鑰中。考慮從 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 會使用快取金鑰來判斷是否有快取命中。根據預設,只有下列請求元件包含在快取金鑰中:/content/stories/example-story.htmld111111abcdef8.cloudfront.net。如果請求的對象不在緩存中(緩存未命中),則 CloudFront 向原點發送請求以獲取對象。獲取對象後,將其 CloudFront 返回給查看器並將其存儲在邊緣位置的緩存中。

當 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,也不適合包含快取金鑰的候選項。如果您在快取金鑰中包含這些值,每個唯一變化都會產生快取中物件的另一個副本。如果物件的這些副本不是唯一的,或者如果您最終得到如此大量稍微不同的物件,每個物件只會得到少量的快取命中,您可能需要考慮不同的方法。您可以從快取金鑰中排除這些高變數值,也可以將物件標示為不可快取。

自訂快取金鑰時請小心。有時候這是可取的,但它可能會產生意想不到的後果,例如快取重複的物件,降低快取命中率以及增加原始伺服器請求的數量。如果您的來源網站或應用程式需要從檢視器請求接收分析、遙測或其他用途的特定值,但這些值不會變更來源傳回的物件,請使用原始伺服器請求政策將這些值包含在原始伺服器請求中,但不會將它們包含在快取金鑰中。