瀏覽器緩存機制(強緩存和協商緩存)


1、為什么需要瀏覽器緩存?
當我們訪問同一個頁面時,請求資源、數據都是需要一定的耗時,如果可以將一些資源緩存下來,那么從第二次訪問開始,就可以減少加載時間,提高用戶體驗,也能減輕服務器的壓力

2、有哪些緩存?
瀏覽器緩存分為強緩存和協商緩存,當存在緩存時,客戶端第一次向服務器請求數據時,客戶端會緩存到內存或者硬盤當中,當第二次獲取相同的資源,強緩存和協商緩存的應對方式有所不同。

強緩存:當客戶端第二次向服務器請求相同的資源時,不會向服務器發送請求,而是直接從內存/硬盤中間讀取

協商緩存:當客戶端第二次向服務器請求相同的資源時,先向服務器發送請求"詢問"該請求的文件緩存在本地與服務器相比是否更改,如果更改,則更新文件,如果沒有就從內存/硬盤中讀取

強緩存由服務器的響應頭里 cache-control 和 expires 兩個字段決定,協商緩存由 last-modified 和 etag兩個字段決定。

3、強緩存
(1) expires
http1.0時定義的字段,表示過期時間,格式如 expires: Mon, 29 Mar 2021 01:03:05 GMT ,表示在這個時間之前,如果客戶端需要再次獲取這個資源,不會向服務器中取,會直接在緩存里讀取。

(2) cache-control
http1.1時的字段,表示緩存的時間長度,格式如 cache-control: max-age=2592000,單位為秒,表示可緩存的時間是30天。
cache-contorl 還有其它一些可以設置的值
no-cache,表示不進行強緩存,但不影響協商緩存
no-store,既不強緩存,也不協商緩存

(3) 兩者的優先級:cache-control 的優先級要高於 expires

 


4、協商緩存
(1) last-modified 與 if-modified-since
last-modified 表示該文件上一次被修改的時間,格式如 last-modified: Tue, 04 Aug 2020 14:54:28 GMT,當客戶端第一次向服務器第一次請求時,服務器會在響應頭上帶上最后修改時間 last-modified,等到第二次客戶端向服務器請求同樣的資源時,客戶端會在請求頭上的 if-modified-since帶上上一次請求的 last-modifed值,服務器對最后修改時間進行比較,如果時間一致,服務器返回304狀態碼,客戶端直接在緩存中讀取數據,如果不一致,服務器返回200的狀態碼,並更新文件

(2) etag 與 if-none-match
etag表示文件的唯一標識,格式如 etag: "5f2976a4-17d",當客戶端第一次向服務器第一次請求時,服務器會在響應頭上帶上文件唯一標識etag,等到第二次客戶端向服務器請求同樣的資源時,客戶端會在請求頭上的 if-none-match帶上上一次請求的etag值,服務器對etag進行比較,如果時間一致,服務器返回304狀態碼,客戶端直接在緩存中讀取數據,如果不一致,服務器返回200的狀態碼,並更新文件

(3) 兩者有什么區別呢?
etag的出現時為了解決last-modified所存在的一些問題
① 當周期性的更改文件的時間,但是並沒有更改文件的內容時,
② last-modifed只能精確到秒,如果一個文件在1秒內更改了多次,那么無法更新到最新的數據,而etag的精確度更高
③ 某些服務器不能精確的得到文件的最后修改時間

(4) 兩者如何使用
last-modified與etag是可以一起使用的,服務器會優先驗證etag,一致的情況下,才會繼續比對last-modified,最后才決定是否返回304


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM