http面試必會的:強制緩存和協商緩存

本文將介紹http中強制緩存和協商緩存的區別前端

1. 什麼是緩存?

瀏覽器緩存(Brower Caching)是瀏覽器對以前請求過的文件進行緩存,以便下一次訪問時重複使用,節省帶寬,提升訪問速度,下降服務器壓力瀏覽器

http緩存機制主要在http響應頭中設定,響應頭中相關字段爲Expires、Cache-Control、Last-Modified、Etag。緩存

HTTP 1.0協議中的。簡而言之,就是告訴瀏覽器在約定的這個時間前,能夠直接從緩存中獲取資源(representations),而無需跑到服務器去獲取。服務器

另:網絡

  • Expires由於是對時間設定的,且時間是Greenwich Mean Time (GMT),而不是本地時間,因此對時間要求較高。

2. 瀏覽器是如何判斷是否使用緩存的

第一次請求:工具

第二次請求相同網頁:

3. 緩存的類別

瀏覽器緩存分爲強緩存和協商緩存spa

強緩存:瀏覽器不會像服務器發送任何請求,直接從本地緩存中讀取文件並返回Status Code: 200 OK

200 form memory cache : 不訪問服務器,通常已經加載過該資源且緩存在了內存當中,直接從內存中讀取緩存。瀏覽器關閉後,數據將不存在(資源被釋放掉了),再次打開相同的頁面時,不會出現from memory cache。3d

200 from disk cache: 不訪問服務器,已經在以前的某個時間加載過該資源,直接從硬盤中讀取緩存,關閉瀏覽器後,數據依然存在,此資源不會隨着該頁面的關閉而釋放掉下次打開仍然會是from disk cache。代理

優先訪問memory cache,其次是disk cache,最後是請求網絡資源code

協商緩存: 向服務器發送請求,服務器會根據這個請求的request header的一些參數來判斷是否命中協商緩存,若是命中,則返回304狀態碼並帶上新的response header通知瀏覽器從緩存中讀取資源;

4. 強緩存和協商緩存的header參數

強緩存:

Expires:過時時間,若是設置了時間,則瀏覽器會在設置的時間內直接讀取緩存,再也不請求

Cache-Control:當值設爲max-age=300時,則表明在這個請求正確返回時間(瀏覽器也會記錄下來)的5分鐘內再次加載資源,就會命中強緩存。

cache-control:除了該字段外,還有下面幾個比較經常使用的設置值:

(1) max-age:用來設置資源(representations)能夠被緩存多長時間,單位爲秒;
(2) s-maxage:和max-age是同樣的,不過它只針對代理服務器緩存而言;
(3)public:指示響應可被任何緩存區緩存;
(4)private:只能針對我的用戶,而不能被代理服務器緩存;
(5)no-cache:強制客戶端直接向服務器發送請求,也就是說每次請求都必須向服務器發送。服務器接收到     請求,而後判斷資源是否變動,是則返回新內容,不然返回304,未變動。這個很容易讓人產生誤解,令人誤     覺得是響應不被緩存。實際上Cache-Control:     no-cache是會被緩存的,只不過每次在向客戶端(瀏覽器)提供響應數據時,緩存都要向服務器評估緩存響應的有效性。
(6)no-store:禁止一切緩存(這個纔是響應不被緩存的意思)。
複製代碼

cache-control是http1.1的頭字段,expires是http1.0的頭字段,若是expires和cache-control同時存在,cache-control會覆蓋expires,建議兩個都寫。

協商緩存:

Last-Modifued/If-Modified-Since和Etag/If-None-Match是分別成對出現的,呈一一對應關係

Etag/If-None-Match:

Etag:

Etag是屬於HTTP 1.1屬性,它是由服務器(Apache或者其餘工具)生成返回給前端,用來幫助服務器控制Web端的緩存驗證。 Apache中,ETag的值,默認是對文件的索引節(INode),大小(Size)和最後修改時間(MTime)進行Hash後獲得的。

If-None-Match:

當資源過時時,瀏覽器發現響應頭裏有Etag,則再次像服務器請求時帶上請求頭if-none-match(值是Etag的值)。服務器收到請求進行比對,決定返回200或304

Last-Modifued/If-Modified-Since:

Last-Modified:

瀏覽器向服務器發送資源最後的修改時間

If-Modified-Since:

當資源過時時(瀏覽器判斷Cache-Control標識的max-age過時),發現響應頭具備Last-Modified聲明,則再次向服務器請求時帶上頭if-modified-since,表示請求時間。服務器收到請求後發現有if-modified-since則與被請求資源的最後修改時間進行對比(Last-Modified),若最後修改時間較新(大),說明資源又被改過,則返回最新資源,HTTP 200 OK;若最後修改時間較舊(小),說明資源無新修改,響應HTTP 304 走緩存。

  • Last-Modifued/If-Modified-Since的時間精度是秒,而Etag能夠更精確。
  • Etag優先級是高於Last-Modifued的,因此服務器會優先驗證Etag
  • Last-Modifued/If-Modified-Since是http1.0的頭字段
相關文章
相關標籤/搜索