摘要:與不一樣的是,當(dāng)服務(wù)器返回的響應(yīng)時(shí),由于重新生成過(guò),中還會(huì)把這個(gè)返回,即使這個(gè)跟之前的沒(méi)有變化瀏覽器收到的響應(yīng)后,就會(huì)從緩存中加載資源。
瀏覽器緩存基本認(rèn)識(shí)
分為強(qiáng)緩存和協(xié)商緩存
瀏覽器在加載資源的時(shí)候,會(huì)根據(jù)這個(gè)資源的http header判斷它是否命中強(qiáng)緩存,如果命中,就直接從緩存中讀取資源,不會(huì)發(fā)請(qǐng)求到服務(wù)器。
當(dāng)強(qiáng)緩存沒(méi)有命中的時(shí)候,瀏覽器一定會(huì)發(fā)送一個(gè)請(qǐng)求到服務(wù)器,通過(guò)服務(wù)器端一句資源的另外一些http header驗(yàn)證這個(gè)資源是否命中協(xié)商緩存,如果協(xié)商緩存命中,服務(wù)器會(huì)將這個(gè)請(qǐng)求返回,告訴客戶端可以直接從緩存中加載這個(gè)資源,于是瀏覽器就又會(huì)從自己的緩存中去加載這個(gè)資源。
當(dāng)協(xié)商緩存也沒(méi)有命中的時(shí)候,瀏覽器直接從服務(wù)器加載資源數(shù)據(jù)。
強(qiáng)緩存原理強(qiáng)緩存是利用Expires或者Cache-Control這兩個(gè)http response header實(shí)現(xiàn)的,它們都用來(lái)表示客戶端緩存的有效期,請(qǐng)求響應(yīng)返回的狀態(tài)為200
ExpireExpire:Thu, 31 Dec 2037 23:55:55 GMT
1)瀏覽器第一次跟服務(wù)器請(qǐng)求一個(gè)資源,服務(wù)器在返回這個(gè)資源的同時(shí),在response的header加上Expires的header;
2)瀏覽器再請(qǐng)求這個(gè)資源時(shí),先從緩存中尋找,找到這個(gè)資源后,拿出它的Expires跟當(dāng)前的請(qǐng)求時(shí)間比較,如果請(qǐng)求時(shí)間在Expire指定的時(shí)間之前,就能命中緩存;
3)如果緩存沒(méi)有命中,瀏覽器直接從服務(wù)器加載資源時(shí),Expire Header在重新加載的時(shí)候會(huì)被更新
缺點(diǎn)
Exipires是較老的強(qiáng)緩存管理header,由于它是服務(wù)器返回的一個(gè)絕對(duì)時(shí)間,在服務(wù)器時(shí)間與客戶端時(shí)間相差較大的時(shí)候,緩存管理容易出現(xiàn)問(wèn)題,比如隨意修改一下客戶端時(shí)間就能影響緩存命中的結(jié)果。
Cache-Control: max-age = 315360000
1)瀏覽器第一次跟服務(wù)器請(qǐng)求一個(gè)資源,服務(wù)器在返回這個(gè)資源的同時(shí),在response的header加上Cache-Control的header;
2)瀏覽器在接收到這個(gè)資源后,會(huì)把這個(gè)資源連同所有response header一起緩存下來(lái)
3)瀏覽器再請(qǐng)求這個(gè)資源時(shí),先從緩存中尋找,找到這個(gè)資源后,根據(jù)它第一次的請(qǐng)求時(shí)間和Cache-Control設(shè)定的有效期,計(jì)算出一個(gè)資源過(guò)期時(shí)間,再拿這個(gè)過(guò)期時(shí)間跟當(dāng)前的請(qǐng)求時(shí)間比較,如果請(qǐng)求時(shí)間再過(guò)期時(shí)間之前,就能命中緩存;
4)如果緩存沒(méi)有命中,瀏覽器直接從服務(wù)器加載資源時(shí),Cache-Control Header 在重新加載的時(shí)候會(huì)被更新。
Expire和Cache-Control的聯(lián)系和區(qū)別前者描述的是絕對(duì)時(shí)間,后者是相對(duì)時(shí)間
可以只啟用一個(gè),也可以同時(shí)啟用,同時(shí)存在時(shí),Cache-Control優(yōu)先級(jí)高于Expire
如何設(shè)置強(qiáng)緩存1)通過(guò)代碼方式,在web服務(wù)器返回的相應(yīng)中添加Expires和Cache-Control Header;
2)通過(guò)配置web服務(wù)器的方式,讓web服務(wù)器在響應(yīng)資源的時(shí)候統(tǒng)一添加Expires和Cache-Control Header
協(xié)商緩存的原理請(qǐng)求響應(yīng)返回的狀態(tài)為304并且會(huì)顯示一個(gè)Not Modified的字符串,協(xié)商緩存是利用的是Last-Modified,If-Modified-since和ETag,If-None-Match這兩對(duì)Header來(lái)管理的
Last-Modified,If-Modified-since原理Last-Modified: Tue, 12 Jan 2016 03:08:53 GMT
If-Modified-Since: Tue, 12 Jan 2016 03:08:53 GMT
1)瀏覽器第一次跟服務(wù)器請(qǐng)求一個(gè)資源,服務(wù)器在返回這個(gè)資源的同時(shí),在respone的header加上Last-Modified的header,這個(gè)header表示這個(gè)資源在服務(wù)器上的最后修改時(shí)間;
2)瀏覽器再次跟服務(wù)器請(qǐng)求這個(gè)資源時(shí),在request的header上加上If-Modified-Since的header,這個(gè)header的值就是上一次請(qǐng)求時(shí)返回的Last-Modified的值;
3)服務(wù)器再次收到資源請(qǐng)求時(shí),根據(jù)瀏覽器傳過(guò)來(lái)If-Modified-Since和資源在服務(wù)器上的最后修改時(shí)間判斷資源是否有變化,如果沒(méi)有變化則返回304 Not Modified,但是不會(huì)返回資源內(nèi)容;如果有變化,就正常返回資源內(nèi)容。當(dāng)服務(wù)器返回304 Not Modified的響應(yīng)時(shí),response header中不會(huì)再添加Last-Modified的header,因?yàn)榧热毁Y源沒(méi)有變化,那么Last-Modified也就不會(huì)改變,這是服務(wù)器返回304時(shí)的response header;
4)瀏覽器收到304的響應(yīng)后,就會(huì)從緩存中加載資源;
5)如果協(xié)商緩存沒(méi)有命中,瀏覽器直接從服務(wù)器加載資源時(shí),Last-Modified Header在重新加載的時(shí)候會(huì)被更新,下次請(qǐng)求時(shí),If-Modified-Since會(huì)啟用上次返回的Last-Modified值;
缺點(diǎn):
有時(shí)候服務(wù)器上資源其實(shí)有變化,但是最后修改時(shí)間卻沒(méi)有變化,而這種問(wèn)題又很不容易被定位出來(lái),而當(dāng)這種情況出現(xiàn)的時(shí)候,就會(huì)影響協(xié)商緩存的可靠性
ETag, If-None-Match原理ETag: "17fd8-5291a5f96fd20"
1)瀏覽器第一次跟服務(wù)器請(qǐng)求一個(gè)資源,服務(wù)器在返回這個(gè)資源的同時(shí),在respone的header加上ETag的header,這個(gè)header是服務(wù)器根據(jù)當(dāng)前請(qǐng)求的資源生成的一個(gè)唯一標(biāo)識(shí),這個(gè)唯一標(biāo)識(shí)是一個(gè)字符串,只要資源有變化這個(gè)串就不同,跟最后修改時(shí)間沒(méi)有關(guān)系,所以能很好的補(bǔ)充Last-Modified的問(wèn)題;
2)瀏覽器再次跟服務(wù)器請(qǐng)求這個(gè)資源時(shí),在request的header上加上If-None-Match的header,這個(gè)header的值就是上一次請(qǐng)求時(shí)返回的ETag的值;
3)服務(wù)器再次收到資源請(qǐng)求時(shí),再根據(jù)資源生成一個(gè)新的ETag,與瀏覽器傳過(guò)來(lái)If-None-Match比較,如果這兩個(gè)值相同就說(shuō)明資源沒(méi)有變化,否則就是有變化;如果沒(méi)有變化則返回304 Not Modified,但是不會(huì)返回資源內(nèi)容;如果有變化,就正常返回資源內(nèi)容。與Last-Modified不一樣的是,當(dāng)服務(wù)器返回304 Not Modified的響應(yīng)時(shí),由于ETag重新生成過(guò),response header中還會(huì)把這個(gè)ETag返回,即使這個(gè)ETag跟之前的沒(méi)有變化
4)瀏覽器收到304的響應(yīng)后,就會(huì)從緩存中加載資源。
注意的問(wèn)題
分布式系統(tǒng)里多臺(tái)機(jī)器間文件的Last-Modified必須保持一致,以免負(fù)載均衡到不同機(jī)器導(dǎo)致比對(duì)失敗;
分布式系統(tǒng)盡量關(guān)閉掉ETag(每臺(tái)機(jī)器生成的ETag都會(huì)不一樣);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/61806.html
摘要:緩存緩存,也叫網(wǎng)關(guān)緩存反向代理緩存。瀏覽器先向網(wǎng)關(guān)發(fā)起請(qǐng)求,網(wǎng)關(guān)服務(wù)器后面對(duì)應(yīng)著一臺(tái)或多臺(tái)負(fù)載均衡源服務(wù)器,會(huì)根據(jù)它們的負(fù)載請(qǐng)求,動(dòng)態(tài)將請(qǐng)求轉(zhuǎn)發(fā)到合適的源服務(wù)器上。雖然這種架構(gòu)負(fù)載均衡源服務(wù)器之間的緩存沒(méi)法共享,但卻擁有更好的處擴(kuò)展性。 一、前言? 工作上遇到一個(gè)這樣的需求,一個(gè)H5頁(yè)面在APP端,如果勾選已讀狀態(tài),則下次打開(kāi)該鏈接,會(huì)跳過(guò)此頁(yè)面。用到了HTML5 的本地存儲(chǔ) API ...
摘要:根據(jù)標(biāo)準(zhǔn),到目前為止,一共有種緩存機(jī)制,有些是之前已有,有些是才新加入的。首次請(qǐng)求緩存有效期內(nèi)請(qǐng)求緩存過(guò)期后請(qǐng)求一般瀏覽器會(huì)將緩存記錄及緩存文件存在本地文件夾中。 騰訊 Bugly 特約作者:賀輝超 1. H5 緩存機(jī)制介紹 H5,即 HTML5,是新一代的 HTML 標(biāo)準(zhǔn),加入很多新的特性。離線存儲(chǔ)(也可稱(chēng)為緩存機(jī)制)是其中一個(gè)非常重要的特性。H5 引入的離線存儲(chǔ),這意味著 web ...
摘要:對(duì)于瀏覽器緩存,相信很多開(kāi)發(fā)者對(duì)它真的是又愛(ài)又恨。那么瀏覽器緩存究竟是個(gè)什么樣的神奇玩意呢什么是瀏覽器緩存簡(jiǎn)單來(lái)說(shuō),瀏覽器緩存就是把一個(gè)已經(jīng)請(qǐng)求過(guò)的資源如頁(yè)面,圖片,,數(shù)據(jù)等拷貝一份副本儲(chǔ)存在瀏覽器中。 對(duì)于瀏覽器緩存,相信很多開(kāi)發(fā)者對(duì)它真的是又愛(ài)又恨。一方面極大地提升了用戶體驗(yàn),而另一方面有時(shí)會(huì)因?yàn)樽x取了緩存而展示了錯(cuò)誤的東西,而在開(kāi)發(fā)過(guò)程中千方百計(jì)地想把緩存禁掉。那么瀏覽器緩存究竟...
摘要:對(duì)于瀏覽器緩存,相信很多開(kāi)發(fā)者對(duì)它真的是又愛(ài)又恨。那么瀏覽器緩存究竟是個(gè)什么樣的神奇玩意呢什么是瀏覽器緩存簡(jiǎn)單來(lái)說(shuō),瀏覽器緩存就是把一個(gè)已經(jīng)請(qǐng)求過(guò)的資源如頁(yè)面,圖片,,數(shù)據(jù)等拷貝一份副本儲(chǔ)存在瀏覽器中。 對(duì)于瀏覽器緩存,相信很多開(kāi)發(fā)者對(duì)它真的是又愛(ài)又恨。一方面極大地提升了用戶體驗(yàn),而另一方面有時(shí)會(huì)因?yàn)樽x取了緩存而展示了錯(cuò)誤的東西,而在開(kāi)發(fā)過(guò)程中千方百計(jì)地想把緩存禁掉。那么瀏覽器緩存究竟...
摘要:從瀏覽器角度來(lái)看,整個(gè)就是一個(gè)源服務(wù)器,從這個(gè)層面來(lái)說(shuō),瀏覽器和服務(wù)器之間的緩存機(jī)制,在這種架構(gòu)下同樣適用。如果命中,則返回,告訴瀏覽器資源未更新,可使用本地的緩存。 緩存類(lèi)型 緩存在宏觀上可以分成兩類(lèi):私有緩存和共享緩存。共享緩存就是那些能被各級(jí)代理緩存的緩存。私有緩存就是用戶專(zhuān)享的,各級(jí)代理不能緩存的緩存。 微觀上可以分下面幾類(lèi): 瀏覽器緩存 緩存存在的意義就是當(dāng)用戶點(diǎn)擊back按...
閱讀 843·2021-09-07 09:58
閱讀 2700·2021-08-31 09:42
閱讀 2873·2019-08-30 14:18
閱讀 3096·2019-08-30 14:08
閱讀 1843·2019-08-30 12:57
閱讀 2769·2019-08-26 13:31
閱讀 1312·2019-08-26 11:58
閱讀 1065·2019-08-23 18:06