什么是 CDN 緩存命中率以及如何計算和優化它?
?本文主要關注 Amazon CloudFront CDN 緩存以及如何使用它們來實現更好的緩存命中率。
在了解緩存中的命中率和未命中率之前,最好先了解緩存是什么。
什么是緩存?
例如,緩存是一種高速存儲器,可臨時保存網頁中的數據或內容,以便下次訪問該頁面時,該內容顯示得更快。它有助于更快地加載網頁以獲得更好的用戶體驗。對于數據庫和其他存儲,也是使用類似的方式。
在 AWS Cloud 中,緩存分為:
- 內容交付網絡 (CDN) 緩存 - CDN 是幾乎所有 Web 應用程序的關鍵組件。過去,CDN 僅通過在全球分布的一組緩存服務器上復制常用請求的文件(靜態內容)來改進內容的交付。
- Web 緩存 - Web 緩存是通過在緩存中保留 HTTP 響應和 Web 資源來執行的,以完成來自緩存而不是來自原始服務器的未來請求。
- 數據庫緩存 - 內存數據緩存是提高整體應用程序性能和降低數據庫成本的最有效策略之一。緩存可以應用于任何類型的數據庫,包括關系數據庫,例如 Amazon RDS 或 NoSQL 數據庫。
- 更多… - AWS緩存解決方案_亞馬遜云緩存服務-AWS云服務(https://aws.amazon.com/cn/caching/aws-caching/)
這些緩存通常由以下 AWS 服務提供:Amazon ElastiCache、Amazon DynamoDB Accelerator (DAX)、Amazon CloudFront CDN 和 AWS Greengrass。
什么是緩存命中率?
緩存命中率是適用于任何緩存的重要指標,不局限于 CDN。緩存命中率描述了從緩存而不是從原始存儲(源服務器)成功提供內容的情況。
這是 CDN 的一項重要指標,但不是唯一需要監控的指標;對于內容變化頻繁的動態網站,緩存命中率會比靜態網站略低。但是,現代 CDN(例如 Amazon CloudFront)也可以執行動態緩存。很多 CDN 服務提供商應在其性能報告中都會提供其緩存命中分數。
什么是緩存未命中率?
它通常以百分比表示,例如 5% 的緩存未命中率。高速緩存未命中率通常是指搜索高速緩存時,未找到數據。發生這種情況時,應將請求轉發到原始存儲/服務器,并將內容傳輸給用戶,并在可能的情況下寫入緩存。
緩存命中和未命中示例
緩存命中示例
用戶打開您網站的主頁,例如,圖片的副本(靜態內容)從用戶附近的緩存服務器加載,因為以前的用戶已經使用過相同的內容。這就是緩存命中率需要時間積累的原因。開始時,緩存命中百分比將為 0%。然后隨著緩存服務器創建數據副本,它會慢慢開始增加。但是對于很多緩存服務器,這可能需要一段時間。
緩存未命中示例
用戶在電子商務網站上打開產品頁面,如果產品圖片的副本當前不在 CDN 緩存中,則此請求會導致緩存未命中,并將請求傳遞到原始圖片的源服務器。CDN 服務器將在源服務器響應后緩存照片,因此對它的任何其他額外請求都將導致緩存命中。
對于大多數網站來說,好的 CDN 緩存命中率是多少?
一般來說,對于大多數網站來說,95-99% 的命中率和 1-5%的未命中率是最理想的。您應該記住,這些數字是特定于用例的,對于動態內容或可能經常更改的特定文件,可能會有很大不同。您應該了解 CDN 使用后的不同的優點,例如安全性和成本優化。
如何計算緩存命中率
計算緩存命中率的最佳方法是將緩存命中總數除以緩存命中總數和緩存未命中數之和。
該值通常以請求或命中適用緩存的百分比表示。
緩存命中率公式和示例如下。
例如,如果您有 43 個緩存命中(請求)和 11 個未命中,那么這意味著您將 43(緩存命中總數)除以 54(11 個緩存未命中和 43 個緩存命中的總和)。結果將是 0.796 的緩存命中率。并將其表示為百分比,將最終結果乘以 100。
這給出了 79.6% 的緩存命中率。
如何衡量 CDN 緩存命中率?
您應該能夠在 CDN 的統計信息中找到緩存命中率。如果您無法找到準確的緩存命中率,您可以嘗試使用上一節中的公式進行計算。
對于 Amazon CloudFront CDN,您可以通過兩種可能的方式在 AWS 管理控制臺中獲取此信息:
- 通過在控制臺中使用Amazon CloudFront 緩存統計信息(https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cache-statistics.html)
- Amazon CloudWatch 中的實時指標
緩存命中和未命中問題
緩存適用于各種用例,但在為每個內容使用 CDN 緩存之前,有幾個可能的問題需要回答:
1、數據結構是否適合緩存?
簡單地緩存數據庫記錄通常足以提供顯著的性能優勢。但是,通常時候,最好以組合多條記錄的格式緩存數據。因為緩存是簡單的鍵值存儲,您可能還需要緩存多種不同格式的數據記錄,以便您可以通過記錄中的不同屬性訪問它。
2、緩存對每個數據都有效嗎?
某些應用程序會生成不適合緩存的訪問模式——例如,掃描頻繁更改的大型數據集。在這種情況下,使緩存保持最新可能會抵消緩存可能提供的任何優勢。
3、使用緩存的內容(值、對象)總是安全的嗎?
? 同一條數據在不同的上下文中可能有不同的一致性要求。例如,在線結賬時,您需要產品的權威價格,因此緩存可能不合適。但是,在產品頁面上,價格可能會過時幾分鐘,而不會對用戶產生負面影響。
高緩存命中率是否總是意味著 CDN 有效?
緩存命中率是 CDN 的一個重要指標,但其他指標對 CDN 的有效性也很重要,例如RTT(往返時間)或其他因素,例如緩存內容的存儲位置。理想情況下,CDN 服務應將內容緩存到盡可能靠近最終用戶和盡可能多的用戶的位置。
如何提高 CDN 的緩存命中率
通常,您可以使用以下建議來提高 CDN 緩存命中率:
1、優化緩存控制頭
Cache-Control 頭域指定了請求和響應情況下的緩存機制的指令。這些標頭用于設置屬性,例如對象的最長期限、到期時間 (TTL) 或對象是否完全緩存。根據內容更改的頻率,您需要指定此屬性。優化這些屬性值可以幫助增加 CDN 上的緩存命中數。
示例: 設置最適合您的內容的生存時間 (TTL)。例如,如果資產大約每兩周更改一次,則 7 天的緩存時間可能是合適的。但是,如果頻繁訪問資產,您可能希望使用一天或更短的生命周期。
2、忽略cookies
Cookie 往往是不可緩存的,因此包含它們的文件也是不可緩存的。因此,制定規則很重要。例如,忽略您希望通過 CDN 交付的資產請求中的所有 cookie 。
3、忽略查詢字符串
查詢字符串有多種用途:它們有助于與 Web 應用程序和 API 交互、聚合用戶指標并為對象提供信息。當查詢字符串包含在靜態對象 URL 中時,就會出現問題。在這種情況下,CDN 會將它們誤認為是唯一對象,并將請求定向到源服務器。因此,即使請求的內容在 CDN 緩存中可用,每個請求都將被歸類為緩存未命中。這會導致緩存命中率不必要地降低。
其他
如果您使用的是 Amazon CloudFront CDN,您可以遵循這些 AWS 建議 (https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cache-hit-ratio.html) 以獲得更高的緩存命中率。本文主要介紹了如何設置和管理對象緩存以提高性能并滿足您的業務需求。?
- 指定 CloudFront 緩存對象的時間
- 使用 CloudFront Origin Shield
- 基于查詢字符串參數的緩存
- 基于 cookie 值的緩存
- 基于請求頭的緩存
- 不需要壓縮時刪除 Accept-Encoding 標頭
- 使用 HTTP 提供媒體內容