天天看點

HTTP緩存機制:強緩存與協商緩存

HTTP緩存分為兩種,強緩存與協商緩存,先來看幾張HTTP請求的截圖:

HTTP緩存機制:強緩存與協商緩存
HTTP緩存機制:強緩存與協商緩存
HTTP緩存機制:強緩存與協商緩存
HTTP緩存機制:強緩存與協商緩存
HTTP緩存機制:強緩存與協商緩存

可以發現請求頭/響應頭裡一些有意思的屬性:ETag、Last-Modified、Expires、Cache-Control、Pragma、If-None-Match、If-Modified-Since等,這些都與HTTP緩存有關系

強緩存

Expires / Cache-Control

Expires是HTTP1.0中的強緩存機制,是一個絕對值時間。

Cache-Control是HTTP/1.1中出現的強緩存機制,是一個相對值時間。

是以當兩者同時出現時,以Cache-Control優先。因為Expires是絕對值時間,用戶端與服務端時間可能存在誤差,是以相對于Cache-Control來說,Expires準确率沒那麼高。

當浏覽器第一次去伺服器請求資料時,伺服器傳回資料,響應頭Date屬性有此請求的時間 Mon, 22 Mar 2021 06:17:00 GMT

若伺服器希望此次HTTP緩存30秒有效,則響應頭中可如下設定

Expires:Mon, 22 Mar 2021 06:17:30 GMT

Cache-Control:max-age=30

當浏覽器再次發起請求,浏覽器通過檢查本地緩存的資料,若未過期,則不需向伺服器發起請求,直接使用本地的緩存資料,此時HTTP狀态碼為200(from memory cache / from disk cache)從記憶體中讀取資料或從硬碟中讀取資料

HTTP緩存機制:強緩存與協商緩存

cache-control的其他屬性:https://baike.baidu.com/item/Cache-control/1885913

Pragma

Pragma是HTTP/1.0中的緩存機制,用來向後相容,算是時代的舊産物,快被抛棄了。

Pragma:no-cache 與 cache-control:no-cache  作用相同

當兩者同時出現時,Pragma優先級更高

協商緩存

協商緩存通常一對一對配合使用,ETag與If-None-Match是一對,Last-Modified與If-Modified-Since是一對。

ETag / If-None-Match

當浏覽器第一次進行請求時,響應頭傳回ETag辨別資源的唯一值(當資源發送變化,這個值會變)

當浏覽器再次進行請求,強緩存又沒有命中的情況,浏覽器會向伺服器發起請求,并在請求頭中攜帶上次請求緩存的ETag值,放在If-None-Match中。

例如第一次請求,響應頭傳回

ETag:48472445140208031

再次請求,強緩存沒有命中,則發起請求的請求頭攜帶

If-None-Match:48472445140208031

服務端根據請求的If-None-Match判斷是否命中緩存,如果資源沒有變化,則值相同,傳回HTTP狀态 304,浏覽器從本地緩存中取值。如果資源被修改,etag值發生變化,則傳回HTTP狀态碼200,新的資源和新的ETag值

Last-Modified / If-Modified-Since

這對協商緩存情侶與上對相比,是通過資源的最後一次修改時間來判斷緩存是否命中。

有以下兩個缺點:

  • 隻要編輯了,不管内容是否真的有改變,都會以這最後修改的時間作為判斷依據,當成新資源傳回,進而導緻了沒必要的請求響應,而這正是緩存本來的作用即避免沒必要的請求。
  • 時間的精确度隻能到秒,如果在一秒内的修改是檢測不到更新的,仍會告知浏覽器使用舊的緩存。

請求過程與上對情侶類似。如果兩對協商緩存情侶同時存在,以ETag優先進行比對