背景:http1中利用緩存機制可以節(jié)約http請求數(shù)量,減少請求數(shù)據(jù)
弱緩存(協(xié)商緩存)
1.第一次請求荠卷,?服務(wù)端通過 last-Modified 或 Etag標(biāo)記實體
再次發(fā)起請求,帶上If-Modified-Since: 上次 Last-Modified 的內(nèi)容或If-None-Match: 上次 ETag 的內(nèi)容稽荧,詢問服務(wù)端資源是否過期钾军。(服務(wù)端此時會對比該文件在服務(wù)器上的last-modified和Etag,若沒有變化系忙,則表示沒有過期)
沒有過期,直接返回一個狀態(tài)碼為 304惠豺、正文為空的響應(yīng)银还,告知瀏覽器使用本地緩存(可以節(jié)約返回數(shù)據(jù))
過期风宁,返回資源,狀態(tài)碼200蛹疯,新的last-modified戒财,ETag,和正文捺弦。
用兩個字段完成標(biāo)識的意義是饮寞?
last-modified有問題,第一列吼,只能精確到秒幽崩,第二,負載均衡算法中寞钥,各機器讀到的文件修改時間不一致慌申,會導(dǎo)致文件無故失效或著得不到更新。ETap是由服務(wù)端生成的摘要凑耻,更準(zhǔn)確太示。
強緩存
用 expire 和cache-control(max-age= xxx) 前者規(guī)定文件到期時間柠贤,后者規(guī)定時間段香浩。expire會依賴客戶端時間,cache-control是相對時間臼勉,更準(zhǔn)確一點邻吭,若兩者同時設(shè)定 cache-control會覆蓋expire
瀏覽器刷新清緩存規(guī)則
F5(cmd+r):清楚一般緩存,就是弱緩存宴霸,可能看到304
control+F5(shift+cmd+r):強制刷新囱晴,強刷會忽略瀏覽器所有緩存(并且請求頭會攜帶 Cache-Control:no-cache 和 Pragma:no-cache,用來通知所有中間節(jié)點忽略緩存)瓢谢。只有從地址欄或收藏夾輸入網(wǎng)址畸写、點擊鏈接等情況下,瀏覽器才會使用強緩存氓扛。
綜合使用
一般服務(wù)端返回的頭部都會帶上上述字段枯芬,那是如何配合使用的呢?
瀏覽器緩存流程
第一次發(fā)起請求(www.baidu.com)
request header:無
response header:status:200采郎,last-modified:xxx,ETag:'xxx',cache-control:max-age=3600
第二次發(fā)起同樣的請求(瀏覽器刷新)
根據(jù)cache-control判斷是否使用緩存千所,若未過期,不向服務(wù)端發(fā)起請求蒜埋,如圖
若過期淫痰,則向服務(wù)端發(fā)起請求,服務(wù)端端根據(jù)last-modified和ETag判斷文件是否有改動整份,若沒有待错,則返回304籽孙,瀏覽器繼續(xù)使用緩存
若文件有改動,則返回200火俄,新的last-modified蚯撩,ETag 以及正文