深入學習瀏覽器的緩存機制

一、強緩存

對於強緩存,瀏覽器在第一次請求的時候,會直接下載資源,然後緩存在本地,第二次請求的時候,直接使用緩存。

強緩存方案

Expires:服務端的響應頭,第一次請求的時候,告訴客戶端,該資源什麼時候會過期。該字段是 http1.0 時的規範,它的值爲一個絕對時間的 GMT 格式的時間字符串,比如 Expires:Mon,18 Oct 2066 23:59:59 GMT。這個時間代表着這個資源的失效時間。在此時間之前,即命中緩存。由於失效時間是一個絕對時間,所以當服務器與客戶端時間偏差較大時,就會導致緩存混亂。Exprires 的缺陷是必須保證服務端時間和客戶端時間嚴格同步。

Cache-Control:該字段是 http1.1 時出現的 header 信息,主要是利用該字段的 max-age 值來進行判斷,它是一個相對時間,例如 Cache-Control:max-age=3600。表示該資源多少時間後過期,解決了客戶端和服務端時間必須同步的問題。

Cache-Control 與 Expires 可以在服務端配置同時啓用,同時啓用的時候 Cache-Control 優先級高。

二、協商緩存

當強緩存沒有命中的時候,瀏覽器會發送一個請求到服務器,服務器根據 header 中的部分信息來判斷是否命中緩存。如果命中,則返回 304 ,告訴瀏覽器資源未更新,可使用本地的緩存。

對於協商緩存,第一次請求緩存且保存緩存標識與時間,重複請求向服務器發送緩存標識和最後緩存時間,服務端進行校驗,如果失效則使用緩存。

協商緩存方案

Last-Modify/If-Modify-Since:第一次請求的時候服務端返回Last-modified表明請求的資源上次的修改時間,第二次請求的時候客戶端帶上請求頭If-Modified-Since,表示資源上次的修改時間,服務端拿到這兩個字段進行對比。如果命中緩存,則返回 304,並且不會返回資源內容,並且不會返回 Last-Modify。

If-None-Match/ETag:緩存標識,對比緩存時使用它來標識一個緩存,第一次請求的時候,服務端會返回該標識給客戶端,客戶端在第二次請求的時候會帶上該標識與服務端進行對比並返回If-None-Match標識是否表示匹配。與 Last-Modify/If-Modify-Since 不同的是,Etag/If-None-Match 返回的是一個校驗碼。ETag 可以保證每一個資源是唯一的,資源變化都會導致 ETag 變化。

Last-Modified 與 ETag 是可以一起使用的,服務器會優先驗證 ETag,一致的情況下,纔會繼續比對 Last-Modified,最後才決定是否返回 304。

三、總結

強緩存與協商緩存的區別可以用下表來表示:

強緩存不過服務器,協商緩存需要過服務器,協商緩存返回的狀態碼是304。兩類緩存機制可以同時存在,強緩存的優先級高於協商緩存。當執行強緩存時,如若緩存命中,則直接使用緩存數據庫中的數據,不再進行緩存協商。

當瀏覽器再次訪問一個已經訪問過的資源時,它會這樣做:

  1. 看看是否命中強緩存,如果命中,就直接使用緩存了。
  2. 如果沒有命中強緩存,就發請求到服務器檢查是否命中協商緩存。
  3. 如果命中協商緩存,服務器會返回 304 告訴瀏覽器使用本地緩存。
  4. 否則,返回最新的資源。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章