緩存未命中和緩存命中:何時發生(以及如何提高緩存命中率)

已發表: 2022-05-04

在沒有可靠緩存策略的情況下優化網站性能就像在流沙上蓋房子一樣。

你可以使用最好的材料和工具,但是當你的基礎不是堅如磐石時,你總會覺得有什麼阻礙了你的進步。

您的緩存策略是您網站卓越網絡性能的支柱。 如果你有一個適當的緩存系統,你可以大大提高你網站的速度。

相反,如果沒有良好的緩存設置,訪問者的請求將導致緩存未命中,進而會減慢頁面加載時間。

緩存未命中只是以下幾行將涵蓋的主題之一:

  • 緩存簡介;
  • 什麼是緩存未命中?
  • 什麼是緩存命中?
  • 什麼是緩存命中率以及如何計算它?
  • 什麼是好的緩存命中率?
  • 如何提高緩存命中率?
  • NitroPack - 實現出色緩存命中率的最簡單方法。

讓我們開始!

緩存簡介

在深入研究緩存命中和未命中的世界之前,必須了解緩存的工作原理、它的用途以及為什麼它被認為是最佳速度優化策略。

要了解緩存,我們需要退後一步,並遵循當訪問者請求您的站點時在幕後參與的整個過程。

您的網站由 HTML 文檔、JavaScript 和 CSS 文件、圖像等組成。它們都存儲在您的源服務器上。 當有人想訪問您的網站時,他們的瀏覽器會向您的源服務器發送一個請求,然後源服務器會返回一個包含所有必要文件的響應。

網絡如何運作

當您有 10 個訪問者同時請求您網站的文件時,應該沒有問題,並且您的服務器可以很容易地處理它們。

但是,當有 100,000 名訪問者想要訪問您的網站時,此模型不起作用。

服務器對它們可以同時處理的請求數量有限制,超過該限制的每個請求都會進入隊列,從而導致訪問者的加載時間更長。

隊列

這就是緩存的用武之地。

簡而言之,緩存是將站點數據(HTML、CSS、JS、圖像等)的副本保存到稱為 Web 緩存的不同位置的過程。

Web 緩存充當用戶和您的源之間的中介角色。 這樣,他們的請求是從緩存中提供的,而不是從您的服務器中檢索的。

緩存

結果,您的頁面加載速度更快。

您可以找到多種類型的緩存分類。 但是為了本文的目的,以及了解何時發生緩存命中和未命中,我們將了解兩種最流行的類型——瀏覽器緩存和代理緩存。


瀏覽器緩存

每個瀏覽器都有自己的緩存策略,它可以將數據本地存儲在用戶的計算機上。

這很有用,因為它可以快速加載以前訪問過的頁面。 事實上,瀏覽器緩存是後退和前進按鈕能夠發揮作用的主要原因。

瀏覽器緩存

不幸的是,瀏覽器緩存僅限於在每個設備上運行。 但它最大的優點是可以保存整個網絡的請求,這讓它成為了必備。


代理服務器緩存

代理緩存有助於減輕服務器上的負載並向最終用戶提供相對更快的內容。 最好的情況是代理緩存與瀏覽器緩存協同工作。

代理服務器分佈在世界各地。 它們通常由 CDN(內容交付網絡)提供商維護。

代理是用戶和您的原始服務器之間的中介。 您可以使用它們將內容緩存在不同的位置,這樣,您的內容將更接近用戶,從而減少延遲和網絡流量:

使用 CDN

與瀏覽器緩存不同,代理服務器緩存不受每個設備的限制,它可以同時向多個用戶提供內容。

這就是緩存的要點。 這是一個細緻入微的話題,還有更多內容有待展開——不同緩存類型的優缺點、如何設置緩存規則等等。

但這不是本文的重點。

如果您想深入了解該主題,可以查看我們的文章 - Web Caching 101: Beginner's Guide To HTTP Caching (Examples, Tips and Strategies)

或觀看我們的 YouTube 視頻:

現在,重要的是要記住,如果在您的網絡緩存中找不到請求的數據,那就是延遲和問題開始發生的時候。 這給我們帶來了緩存未命中。


什麼是緩存未命中?

當系統、應用程序或瀏覽器請求從緩存中檢索數據,但當前無法在緩存內存中找到該特定數據時,就會發生緩存未命中。

當發生緩存未命中時,請求將被轉發到源服務器。

一旦從源中檢索到數據,然後將其複制並存儲到高速緩存中,以預期將來對相同數據的類似請求。

發生緩存未命中的原因有多種。

例如,特定數據從一開始就沒有被緩存。

假設您有一個電子商務網站,並且您剛剛添加了一個新產品頁面。 所有圖像、HTML、CSS 和 JavaScript 文件從未被添加到緩存中,因為沒有人請求它們。 這意味著您的第一位訪問者必須向您的來源發送請求才能加載頁面。 在第一次請求之後,數據將被傳輸到緩存並從中提供服務。

緩存未命中的另一種可能性是緩存數據在某個時候被刪除。

同樣,有幾件事可能會導致這種情況 - 需要更多空間,應用程序請求刪除,或者數據的生存時間策略已過期。

我們將在本文後面更多地討論生存時間。

不管是什麼原因,事實是每次緩存未命中都會導致更長的延遲、緩慢的加載時間、糟糕的用戶體驗和不滿意的訪問者。

但是,我不想給您留下需要在 100% 的時間內實現緩存命中的印象。 那是不現實的。

此外,在某些情況下,緩存未命中是必要的,因為您可能需要確保所提供的內容始終是最新的。

例如,像 bbc.com 這樣的新聞網站可以在一天中多次更改其主頁內容,因為需要報導突發新聞。 在這種情況下,緩存命中意味著他們的讀者沒有看到他們網站的最新版本,並且分別 - 他們錯過了最新消息。

因此,緩存未命中的發生是有好處的。

但是,如果您沒有新聞網站並且不定期更改您的內容,那麼您應該致力於盡可能降低緩存未命中率和盡可能高的緩存命中率。


什麼是緩存命中?

當請求的數據從緩存中成功提供時,就會發生緩存命中。

例如,如果用戶訪問您的某個產品頁面,該頁面應該顯示您銷售的產品的圖像,他們的瀏覽器會將對該圖像的請求發送到緩存(瀏覽器或 CDN)。 如果 CDN 在其存儲中具有圖像的副本,則請求會導致緩存命中,並且圖像會被發送回瀏覽器。


什麼是緩存命中率以及如何計算它?

緩存命中率衡量一個緩存從其存儲中成功傳遞的請求數,與它總共接收到的請求數相比較。

高緩存命中率意味著您的大部分用戶請求已由緩存完成,這反過來意味著他們的加載時間更快。

您可以使用以下公式計算緩存命中率:

緩存命中率公式

但是,這可能不是必需的,因為大多數 CDN 提供商都會為您計算這一點。

NitroPack 的儀表板也顯示此信息:

NitroPack CHR


什麼是好的緩存命中率?

作為一般經驗法則 - 80% 或更高的緩存命中率是一個很好的結果,因為這意味著大多數請求都是從緩存中提供的。

靜態網站上低於 80% 的任何值都表明緩存策略效率低下。

根據全球最大的 CDN 提供商之一 Cloudflare 的說法:

“一個主要由靜態內容組成的典型網站很容易擁有 95-99% 範圍內的緩存命中率。”

NitroPack 的全局緩存命中率為 90%。 大約 70% 的 NitroPack 用戶體驗到 80% 或更高的緩存命中率。


如何提高緩存命中率?

您可以採取特定步驟來減少緩存未命中的數量,從而提高緩存命中率。

1.根據您網站的需要設置緩存規則

緩存控制標頭允許您設置無數不同的緩存規則,以優化您的內容服務。

一些規則包括:

  • no-store告訴網絡緩存在任何情況下都不要存儲任何版本的資源;
  • no-cache告訴 Web 緩存它必須在將緩存內容提供給用戶之前通過源服務器驗證緩存內容;
  • max-age設置緩存在重新下載或使用源服務器重新驗證之前可以保留保存的資源的最長時間(以秒為單位)。 之後,內容被標記為過時;
  • s-maxage與 max-age 完全相同,但僅適用於代理緩存;
  • private告訴網絡緩存只有私有緩存可以存儲響應;
  • public將響應標記為公開。 任何中間緩存都可以存儲標有該指令的響應;

緩存控制頭

您應該設置一個最適合您的內容的生存時間(緩存在從源檢索更新信息之前將保留您的數據的時間)。

例如,如果資產大約每兩個月更改一次,則 50 天的max-age標頭可能是合適的。 但是,如果資產每天都在更改,您可能希望使用無緩存標頭。

您可以在我們的 YouTube 視頻中找到有關緩存控制標頭、緩存新鮮度和驗證的更多信息:

2.忽略UTM參數

運行多個廣告活動(例如,Facebook 廣告、Google 廣告等)會生成具有特定 UTM 參數的不同 URL。

因此,您有一個頁面需要優化多個變體(不同的 UTM 參數)。

UTM 標籤

這是一個問題,因為每個 URL 變體都被認為是一個唯一的對象,並且每個請求都將被定向到源服務器。

因此,即使請求的內容在 Web 緩存中可用,每個請求都將被歸類為緩存未命中。

這會導致緩存命中率不必要地降低。


NitroPack - 實現出色緩存命中率的最簡單方法

在我們介紹完所有內容之後,實現高緩存命中率的整個過程可能聽起來有點不知所措。

好消息是,如果您與 CDN 提供商合作,我提到的大部分內容(例如緩存控制標頭)可能已經為您處理好了。

對於其他一切,您可以使用緩存插件。

例如,NitroPack 具有開箱即用的功能,可確保我們用戶的高緩存命中率。 這包括:

  • 緩存預熱將模擬對您網站的自然訪問,這會自動導致 NitroPack 為桌面和移動設備準備優化(緩存)版本的網站。
  • 緩存失效將緩存的內容標記為“陳舊”,但會一直提供服務,直到有新優化的內容可用。 因此,您的訪問者總是會看到優化的內容,即使它可能會在短時間內過時。
  • 內置 CDN,無需您將 CDN 與您選擇的緩存插件同步。 這通常很耗時、不方便,並且可能會導致意想不到的問題。
  • 忽略參數選項,允許 NitroPack 默認忽略一些常用的 UTM(和其他)參數,這樣您在運行營銷活動時無需擔心。

忽略參數

但你不必相信我的話。 免費測試 NitroPack,親眼看看它的影響。