簡(jiǎn)介
在面試的時(shí)候總是遇到緩存相關(guān)問(wèn)題失都,回答總是停留緩存就是從瀏覽器中獲取唱矛,不向服務(wù)器發(fā)送請(qǐng)求,回答的不讓面試官滿意,索性抽點(diǎn)時(shí)間整理一下前端相關(guān)的緩存又官,希望下次回答的時(shí)候能夠多講點(diǎn)模孩。
前端緩存分為強(qiáng)緩存和協(xié)商緩存琳要,強(qiáng)緩存就是在緩存未失效時(shí)衫嵌,不在請(qǐng)求服務(wù)端,協(xié)商緩存就是去跟服務(wù)器比較是否需要重新獲取資源 砂心。
強(qiáng)緩存
強(qiáng)緩存分為兩種懈词,Cache-control和Expires,Expires是HTTP1.0的東西计贰,它的值是一個(gè)格林時(shí)間钦睡,比如Expires: Wed, 21 Oct 2015 07:28:00 GMT
,由于服務(wù)器端和瀏覽器端的時(shí)間差異問(wèn)題躁倒,瀏覽器比服務(wù)器時(shí)間快荞怒,會(huì)導(dǎo)致緩存失效。Cache-control是HTTP1.1時(shí)代的新東西秧秉,設(shè)置的是一個(gè)相對(duì)時(shí)間褐桌,Cache-Control:public, max-age=31536000
,在31536000秒后才緩存才失效象迎,Cache-control有很多取值荧嵌。
- public: 可以在客戶端和代理服務(wù)緩存
- private: 只可以在客戶端緩存,,不能在在代理服務(wù)器緩存
- no-cahce: 要求客戶端提交緩存信息與服務(wù)器端進(jìn)行驗(yàn)證(協(xié)商緩存)
- no-store: 不使用緩存砾淌,每次都去服務(wù)獲取數(shù)據(jù)
- max-age=xxx: 緩存多少秒后失效
強(qiáng)緩存在緩存失效內(nèi)啦撮,不會(huì)從原始服務(wù)器獲取新的數(shù)據(jù),假如在緩存時(shí)段內(nèi)服務(wù)器有資源更新汪厨,會(huì)導(dǎo)致資源獲取不及時(shí)赃春。
協(xié)商緩存
協(xié)商緩存有兩組報(bào)文
- Last-Modified和If-modified-since
-
ETag和If-None-Match
image.png
- Last-Modified和If-modified-since都是時(shí)間格林時(shí)間,當(dāng)請(qǐng)求資源時(shí)劫乱,服務(wù)端會(huì)把資源修改時(shí)間已格林時(shí)間格式放在報(bào)文Last-Modified發(fā)生給客戶端织中,客戶端再次請(qǐng)求資源時(shí)锥涕,會(huì)把上次返回的是Last-Modified的值放在If-modified-since中,服務(wù)端根據(jù)客戶端的If-modified-since的值跟資源修改時(shí)間做判斷狭吼,如果相等的話返回304层坠,從緩存獲取資源,如果不相等返回200刁笙,重新獲取資源破花,重新建立緩存。雖然Last-modified和If-modified-since解決了強(qiáng)緩存帶來(lái)的問(wèn)題采盒,但是格林時(shí)間只精確到秒旧乞,如果在1秒發(fā)生多次修改,也會(huì)導(dǎo)致資源獲取不及時(shí)
- Etag和If-None-Match磅氨,只有當(dāng)文件發(fā)生變化后Etag的值才會(huì)發(fā)生變化,客戶端訪問(wèn)服務(wù)端時(shí)嫡纠,服務(wù)端把文件的Etag值返回給客戶端烦租,下次客戶端訪問(wèn)時(shí)把上次的Etag值放在If-None-Match,服務(wù)端根據(jù)客戶端的If-None-match值跟資源的Etag值做比較除盏,如果值發(fā)生變化走200叉橱,重新獲取資源和建立緩存,如果相當(dāng)返回304走緩存