博客 / 詳情

返回

強緩存和協商緩存

為什麼有這個東西?

web緩存描述 :

Web 緩存是可以自動保存常見文檔副本的 HTTP 設備。當 Web 請求抵達緩存時, 如果本地有“已緩存的”副本,就可以從本地存儲設備而不是原始服務器中提取這 個文檔。(此結論來自http權威指南)

緩存的優缺點:

優點:

  • 緩存減少了冗餘的數據傳輸,節省了你的網絡費用。
  • 緩存緩解了網絡瓶頸的問題。不需要更多的帶寬就能夠更快地加載頁面。
  • 緩存降低了對原始服務器的要求。服務器可以更快地響應,避免過載的出現。
  • 緩存降低了距離時延,因為從較遠的地方加載頁面會更慢一些。

缺點:

  • 緩存中的數據可能與服務器的數據不一致;
  • 消耗內存;

第一階段、強緩存驗證:

根據請求頭相關控制字段開始嘗試命中

1、 驗證位置:本地(內存或者硬盤,根據瀏覽器策略決定),
2、 驗證字段:就兩個,expires (http1.0中出現)cache-control (http1.1中出現),如果這兩個字段同時出現,cache-control會覆蓋expires

image-20220323211858097

3、驗證流程: 查看兩個字段的指定時間,如果過期則跳到下一階段(協商緩存)

4、如果命中: 狀態碼:200 (from disk cache)或是200 OK (from memory cache) 註釋:根據該緩存的內存佔用進行存儲,內存佔用過高則存入磁盤

cache-control 常用的參數:

private:客户端可以緩存
public:客户端和代理服務器均可緩存;
max-age=xxx:緩存的資源將在 xxx 秒後過期,常見:2592000(三十天)、31536000(一年);
no-cache:跳過當前強驗證步驟,使用下一階段協商緩存來驗證是否過期;
must-revalidate:如果強緩存時間過期,必須去服務器進行有效性檢驗這個舊的緩存
no-transform:多用於圖片,不允許對資源進行轉換壓縮

第二階段、協商緩存驗證:

1、驗證位置:服務器

2、驗證字段:有兩組,Last-Modified + If-Modified-SinceETag + If-None-Match

3、驗證流程:
Last-Modified + If-Modified-Since: 修改日期比較
上次請求時,緩存文件中的Last-Modified記錄該資源的修改日期,本次請求時,Last-Modified會通過請求頭If-Modified-Since傳遞給服務器,服務器端的最新修改日期和該緩存文件的最新修改日期比較;
ETag + If-None-Match: 緩存驗證
ETag是服務器端認為設置的一串唯一字符串(一般是哈希或者版本號),本次請求時,If-None-Match 傳入緩存文件的ETag值,去和服務器裏的該資源的ETag比較,以達到緩存驗證的目的;

4、驗證結果:
Last-Modified + If-Modified-Since:
如果If-Modified-Since就是 服務器端該文件的最新修改日期,説明緩存是新鮮的,服務器返回304,瀏覽器使用本地緩存;
如果If-Modified-Since早於 服務器端該文件的最新修改日期,説明緩存不新鮮,服務器返回新的該資源,並且更新該資源Last-Modified日期
ETag + If-None-Match
如果If-None-Match傳遞給後台的緩存ETag值和後台對應該文件的ETag值一樣,説明該緩存新鮮,服務器返回 304 狀態碼,瀏覽器使用本地緩存;
如果If-None-Match傳遞給後台的緩存ETag值和後台對應該文件的ETag值不一樣,説明該緩存不新鮮,服務器返回更新的資源和新的 Etag值;

參考內容:

淺解強緩存和協商緩存 - 掘金

瀏覽器緩存(強緩存、協商緩存)一遍過 - 掘金

user avatar dujing_5b7edb9db0b1c 頭像 niumingxin 頭像 79px 頭像 mapvthree 頭像 qingji_58b3c385d0028 頭像 513928731 頭像 air_clou_d 頭像 mianduijifengba_59b206479620f 頭像 like_5af2bb418652b 頭像
9 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.