摘要:協(xié)商緩存用戶發(fā)送的請求,發(fā)送到服務(wù)器后,由服務(wù)器判定是否從緩存中獲取資源。如果想主動清除緩存,也可以在請求頭信息中加入來禁止緩存。主要取值如下緩存的時效由決定。是的字段,而是的字段,當(dāng)與同時存在時,的優(yōu)先級要高于。
在講這幾個屬性之前,先復(fù)習(xí)下瀏覽器的緩存機(jī)制,再結(jié)合了解一下Last-Modified / If-Modified-Since、Etag / If-Match、cache-control / expires
瀏覽器緩存位置分為四種,其優(yōu)先級順序如下:
Service Worker、Memory Cache、Disk Cache、Push Cache,當(dāng)上述四個緩存位置中的緩存都沒有命中時,則會向服務(wù)器發(fā)起請求。
Service Worker: 不做了解;
Push Cache: 不做了解;
Memory Cache: 即內(nèi)存中的緩存,其特點(diǎn)是容量小、讀取高效、持續(xù)性短,會隨著進(jìn)程的釋放而釋放,在內(nèi)存使用率低、緩存小尺寸資源時,會以 Memory Cache 為優(yōu)先;
Disk Cache: 即磁盤中的緩存,其特點(diǎn)是容量大、讀取緩慢、持續(xù)性長,任何資源都能存儲到磁盤中,在內(nèi)存使用率高、緩存大尺寸資源時,會以 Disk Cache 為優(yōu)先;
瀏覽器緩存策略分為兩種,強(qiáng)緩存和協(xié)商緩存:
強(qiáng)制緩存
用戶發(fā)送的請求,直接從客戶端緩存中獲取,不發(fā)送請求到服務(wù)器,不與服務(wù)器發(fā)生交互行為。
協(xié)商緩存
用戶發(fā)送的請求,發(fā)送到服務(wù)器后,由服務(wù)器判定是否從緩存中獲取資源。
可用如下流程圖來概括瀏覽器的緩存機(jī)制:
瀏覽器的緩存主要是針對靜態(tài)資源進(jìn)行緩存,如圖片、文件、js等。
當(dāng)用戶發(fā)起請求時,瀏覽器先執(zhí)行(a)步驟,查看是否有緩存,如果我們用的是谷歌瀏覽器,也可以在地址欄輸入chrome://cache/查看你發(fā)起的請求鏈接是否在緩存列表中。如果想主動清除緩存,也可以在請求頭信息中加入“Cache-Control: no-store”來禁止緩存。下次是緩存列表中打開的緩存:
如果瀏覽器中有緩存則執(zhí)行(b)步驟,查看緩存是否過期,主要是通過緩存中存儲的響應(yīng)頭信息中的緩存標(biāo)識字段 Expires 或 Cache-Control 來驗證緩存資源是否過期。Expires 是服務(wù)器端在響應(yīng)請求時用來規(guī)定資源的失效時間。Cache-Control 是服務(wù)器端在響應(yīng)請求時用來規(guī)定資源是否需要被瀏覽器緩存以及緩存的有效時間等。Cache-Control 主要取值如下:
緩存的時效由max-age決定。在max-age設(shè)定的時間內(nèi)對當(dāng)前資源發(fā)起訪問后使用的都是瀏覽器內(nèi)部的緩存!超過max-age設(shè)定的時間后瀏覽器會選擇使用協(xié)商緩存。
響應(yīng)頭信息中的no-cahce,表示不使用強(qiáng)制緩存,直接進(jìn)入?yún)f(xié)商緩存,請求頭信息中的no-cache,則表示要重新獲取請求,其作用類似于no-store,響應(yīng)頭信息的no-cache和max-age=0和請求頭信息的max-age=0的作用是一樣的:都要求在使用緩存之前進(jìn)行驗證。
Expires 是 HTTP 1.0 的字段,而 Cache-Control 是 HTTP 1.1 的字段,當(dāng) Expires 與 Cache-Control 同時存在時,Cache-Control 的優(yōu)先級要高于 Expires。為了保證瀏覽器兼容,一般兩個字段后端都會同時返回給前端,若是命中緩存(即存在緩存資源并且緩存資源未過期),則瀏覽器響應(yīng) HTTP Status Code 200,并直接使用緩存資源作為返回結(jié)果,不需要發(fā)起 HTTP 請求,為強(qiáng)制緩存;若是存在緩存資源但緩存資源已過期,則進(jìn)入下一步驟協(xié)商緩存
與(c)協(xié)商緩存相關(guān)的緩存標(biāo)識字段是 Last-Modified 和 Etag。
Last-Modified 是服務(wù)器端在響應(yīng)請求時用來說明資源的最后修改時間。與之對應(yīng)的是 If-Modified-Since 字段,在協(xié)商緩存過程中,瀏覽器發(fā)送的 HTTP 請求中 Header 中會帶上 If-Modified-Since 字段,值為緩存資源 Last-Modified 屬性的值。
當(dāng)服務(wù)器端接收到帶有 If-Modified-Since 的請求時,則會將 If-Modified-Since 的值與被請求資源的最后修改時間做對比。如果相同,說明資源沒有新的修改,則響應(yīng) HTTP Status Code 304,瀏覽器會繼續(xù)使用緩存資源;如果最后修改時間比較新,則說明資源被修改過,則響應(yīng) HTTP Status Code 200,并返回最新的資源。
Etag 是服務(wù)器端在響應(yīng)請求時用來說明資源在服務(wù)器端的唯一標(biāo)識。與之對應(yīng)的是 If-None-Match 字段,在協(xié)商緩存過程中,瀏覽器發(fā)送的 HTTP 請求中 Header 中會帶上 If-None-Match 字段,值為該緩存資源 Etag 屬性的值。
當(dāng)服務(wù)器端接收到帶有 If-None-Match 的請求時,則會將 If-None-Match 的值與被請求資源的唯一標(biāo)識做對比。如果相同,說明資源沒有新的修改,則響應(yīng) HTTP Status Code 304,瀏覽器會繼續(xù)使用緩存資源;如果不同,則說明資源被修改過,則響應(yīng) HTTP Status Code 200,并返回最新的資源。
Last-Modified 是 HTTP 1.0 的字段,而 Etag 是 HTTP 1.1 的字段,當(dāng) Last-Modified 與 Etag 同時存在時,Etag 的優(yōu)先級要高于 Last-Modified。Etag 的出現(xiàn)主要是為了解決 Last-Modified 存在的問題。
最后,最新請求下來的資源,瀏覽器會根據(jù)Expires 與 Cache-Control判斷是否進(jìn)行緩存。
<完>
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/109914.html
摘要:協(xié)商緩存用戶發(fā)送的請求,發(fā)送到服務(wù)器后,由服務(wù)器判定是否從緩存中獲取資源。如果想主動清除緩存,也可以在請求頭信息中加入來禁止緩存。主要取值如下緩存的時效由決定。是的字段,而是的字段,當(dāng)與同時存在時,的優(yōu)先級要高于。 在講這幾個屬性之前,先復(fù)習(xí)下瀏覽器的緩存機(jī)制,再結(jié)合了解一下Last-Modified / If-Modified-Since、Etag / If-Match、cache-...
閱讀 2500·2021-11-15 18:14
閱讀 1723·2021-10-14 09:42
閱讀 3765·2021-10-11 10:58
閱讀 3962·2021-10-09 09:44
閱讀 2424·2021-09-26 09:55
閱讀 2448·2021-09-24 10:38
閱讀 2036·2021-09-04 16:48
閱讀 3278·2021-09-02 15:21