什么是http緩存,有什么作用
- 通過網絡獲取內容既速度緩慢又開銷巨大。較大的響應需要在客戶端與服務器之間進行多次往返通信,這會延遲瀏覽器獲得和處理內容的時間,還會增加訪問者的流量費用。因此,緩存並重復利用之前獲取的資源的能力成為性能優化的一個關鍵方面。
- 好在每個瀏覽器都自帶了 HTTP 緩存實現功能。您只需要確保每個服務器響應都提供正確的 HTTP 標頭指令,以指示瀏覽器何時可以緩存響應以及可以緩存多久。
- 注:如果您在應用中使用 Webview 來獲取和顯示網頁內容,可能需要提供額外的配置標志,以確保 HTTP 緩存得到啟用、其大小根據用例進行了合理設置並且緩存將持久保存。務必查看平台文檔並確認您的設置!
當服務器返回響應時,還會發出一組 HTTP 標頭,用於描述響應的內容類型、長度、緩存指令、驗證令牌等。例如,在上圖的交互中,服務器返回一個 1024 字節的響應,指示客戶端將其緩存最多 120 秒,並提供一個驗證令牌(“x234dff”),可在響應過期后用來檢查資源是否被修改。
通過 ETag 驗證緩存的響應
- 服務器使用 ETag HTTP 標頭傳遞驗證令牌。
- 驗證令牌可實現高效的資源更新檢查:資源未發生變化時不會傳送任何數據。
假定在首次獲取資源 120 秒后,瀏覽器又對該資源發起了新的請求。首先,瀏覽器會檢查本地緩存並找到之前的響應。遺憾的是,該響應現已過期,瀏覽器無法使用。此時,瀏覽器可以直接發出新的請求並獲取新的完整響應。不過,這樣做效率較低,因為如果資源未發生變化,那么下載與緩存中已有的完全相同的信息就毫無道理可言!
這正是驗證令牌(在 ETag 標頭中指定)旨在解決的問題。服務器生成並返回的隨機令牌通常是文件內容的哈希值或某個其他指紋。客戶端不需要了解指紋是如何生成的,只需在下一次請求時將其發送至服務器。如果指紋仍然相同,則表示資源未發生變化,您就可以跳過下載。
在上例中,客戶端自動在“If-None-Match” HTTP 請求標頭內提供 ETag 令牌。服務器根據當前資源核對令牌。如果它未發生變化,服務器將返回“304 Not Modified”響應,告知瀏覽器緩存中的響應未發生變化,可以再延用 120 秒。請注意,您不必再次下載響應,這節約了時間和帶寬。
作為網絡開發者,您如何利用高效的重新驗證?瀏覽器會替我們完成所有工作:它會自動檢測之前是否指定了驗證令牌,它會將驗證令牌追加到發出的請求上,並且它會根據從服務器接收的響應在必要時更新緩存時間戳。我們唯一要做的就是確保服務器提供必要的 ETag 令牌。檢查您的服務器文檔中有無必要的配置標志。
注:提示:HTML5 Boilerplate 項目包含所有最流行服務器的配置文件樣例,其中為每個配置標志和設置都提供了詳細的注解。在列表中找到您喜愛的服務器,查找合適的設置,然后復制/確認您的服務器配置了推薦的設置
Cache-Control
- 每個資源都可通過 Cache-Control HTTP 標頭定義其緩存策略
- Cache-Control 指令控制誰在什么條件下可以緩存響應以及可以緩存多久。
從性能優化的角度來說,最佳請求是無需與服務器通信的請求:您可以通過響應的本地副本消除所有網絡延遲,以及避免數據傳送的流量費用。為實現此目的,HTTP 規范允許服務器返回 Cache-Control 指令,這些指令控制瀏覽器和其他中間緩存如何緩存各個響應以及緩存多久。
注:Cache-Control 標頭是在 HTTP/1.1 規范中定義的,取代了之前用來定義響應緩存策略的標頭(例如 Expires)。所有現代瀏覽器都支持 Cache-Control,因此,使用它就夠了。
“no-cache”和“no-store”
“no-cache”表示必須先與服務器確認返回的響應是否發生了變化,然后才能使用該響應來滿足后續對同一網址的請求。因此,如果存在合適的驗證令牌 (ETag),no-cache 會發起往返通信來驗證緩存的響應,但如果資源未發生變化,則可避免下載。
相比之下,“no-store”則要簡單得多。它直接禁止瀏覽器以及所有中間緩存存儲任何版本的返回響應,例如,包含個人隱私數據或銀行業務數據的響應。每次用戶請求該資產時,都會向服務器發送請求,並下載完整的響應。
“public”與“private”
如果響應被標記為“public”,則即使它有關聯的 HTTP 身份驗證,甚至響應狀態代碼通常無法緩存,也可以緩存響應。大多數情況下,“public”不是必需的,因為明確的緩存信息(例如“max-age”)已表示響應是可以緩存的。
相比之下,瀏覽器可以緩存“private”響應。不過,這些響應通常只為單個用戶緩存,因此不允許任何中間緩存對其進行緩存。例如,用戶的瀏覽器可以緩存包含用戶私人信息的 HTML 網頁,但 CDN 卻不能緩存。
“max-age”
指令指定從請求的時間開始,允許獲取的響應被重用的最長時間(單位:秒)。例如,“max-age=60”表示可在接下來的 60 秒緩存和重用響應。