1爸业、為什么需要瀏覽器緩存其骄?
當我們訪問同一個頁面時,請求資源扯旷、數(shù)據(jù)都是需要一定的耗時拯爽,如果可以將一些資源緩存下來,那么從第二次訪問開始钧忽,就可以減少加載時間毯炮,提高用戶體驗,也能減輕服務器的壓力
2耸黑、有哪些緩存桃煎?
瀏覽器緩存分為強緩存和協(xié)商緩存,當存在緩存時大刊,客戶端第一次向服務器請求數(shù)據(jù)時为迈,客戶端會緩存到內(nèi)存或者硬盤當中,當?shù)诙潍@取相同的資源缺菌,強緩存和協(xié)商緩存的應對方式有所不同葫辐。
強緩存:當客戶端第二次向服務器請求相同的資源時,不會向服務器發(fā)送請求伴郁,而是直接從內(nèi)存/硬盤中間讀取
協(xié)商緩存:當客戶端第二次向服務器請求相同的資源時耿战,先向服務器發(fā)送請求"詢問"該請求的文件緩存在本地與服務器相比是否更改,如果更改蛾绎,則更新文件昆箕,如果沒有就從內(nèi)存/硬盤中讀取
強緩存由服務器的響應頭里 cache-control 和 expires 兩個字段決定鸦列,協(xié)商緩存由 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 還有其它一些可以設(shè)置的值
no-cache,表示不進行強緩存券勺,但不影響協(xié)商緩存
no-store绪钥,既不強緩存,也不協(xié)商緩存
(3) 兩者的優(yōu)先級:cache-control 的優(yōu)先級要高于 expires
4关炼、協(xié)商緩存
(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狀態(tài)碼褥影,客戶端直接在緩存中讀取數(shù)據(jù)池户,如果不一致,服務器返回200的狀態(tài)碼凡怎,并更新文件
(2) etag 與 if-none-match
etag表示文件的唯一標識校焦,格式如 etag: "5f2976a4-17d",當客戶端第一次向服務器第一次請求時统倒,服務器會在響應頭上帶上文件唯一標識etag寨典,等到第二次客戶端向服務器請求同樣的資源時,客戶端會在請求頭上的 if-none-match帶上上一次請求的etag值房匆,服務器對etag進行比較耸成,如果時間一致报亩,服務器返回304狀態(tài)碼,客戶端直接在緩存中讀取數(shù)據(jù)井氢,如果不一致弦追,服務器返回200的狀態(tài)碼,并更新文件
(3) 兩者有什么區(qū)別花竞?
etag的出現(xiàn)時為了解決last-modified所存在的一些問題
① 當周期性的更改文件的時間劲件,但是并沒有更改文件的內(nèi)容時,
② last-modifed只能精確到秒约急,如果一個文件在1秒內(nèi)更改了多次零远,那么無法更新到最新的數(shù)據(jù),而etag的精確度更高
③ 某些服務器不能精確的得到文件的最后修改時間
(4) 兩者如何使用厌蔽?
last-modified與etag是可以一起使用的牵辣,服務器會優(yōu)先驗證etag,一致的情況下奴饮,才會繼續(xù)比對last-modified纬向,最后才決定是否返回304