摘要:協(xié)商緩存則會(huì)向服務(wù)器請(qǐng)求確認(rèn)資源是否過(guò)期。這也是緩存驗(yàn)證的順序,先使用強(qiáng)緩存,后使用協(xié)商緩存。表明響應(yīng)只能被單個(gè)用戶緩存,不能作為共享緩存即代理服務(wù)器不能緩存它可以緩存響應(yīng)內(nèi)容。設(shè)置緩存存儲(chǔ)的最大周期,超過(guò)這個(gè)時(shí)間緩存被認(rèn)為過(guò)期單位秒。
為什么會(huì)有HTTP緩存?HTTP緩存的存在是因?yàn)閣eb前端的性能瓶頸大部分的原因在于HTTP傳輸?shù)臅r(shí)間耗費(fèi)過(guò)長(zhǎng)。如果能夠減少這種HTTP請(qǐng)求的時(shí)間,對(duì)網(wǎng)頁(yè)的性能來(lái)說(shuō)是非常大的提升,對(duì)于用戶的體驗(yàn)也能得到極大的改善。
HTTP緩存標(biāo)識(shí)HTTP緩存可分為強(qiáng)緩存(Cache-Control和Expires)以及協(xié)商緩存(Etag和Last-Modified)。
強(qiáng)緩存和協(xié)商緩存的區(qū)別在于:如果命中強(qiáng)緩存,會(huì)直接從緩存中讀取資源,不向服務(wù)器請(qǐng)求。協(xié)商緩存則會(huì)向服務(wù)器請(qǐng)求確認(rèn)資源是否過(guò)期。這也是緩存驗(yàn)證的順序,先使用強(qiáng)緩存,后使用協(xié)商緩存。
下面則簡(jiǎn)單介紹一下這兩種緩存類型的標(biāo)識(shí)
Cache-ControlCache-Control設(shè)置有效期max-age的值是時(shí)間的相對(duì)值。
下面則簡(jiǎn)單介紹Cache-Control常用的使用值:
value | description |
---|---|
public | 表明響應(yīng)可以被任何對(duì)象(包括:發(fā)送請(qǐng)求的客戶端,代理服務(wù)器,等等)緩存。 |
private | 表明響應(yīng)只能被單個(gè)用戶緩存,不能作為共享緩存(即代理服務(wù)器不能緩存它),可以緩存響應(yīng)內(nèi)容。 |
no-cache | 在發(fā)布緩存副本之前,強(qiáng)制高速緩存將請(qǐng)求提交給原始服務(wù)器進(jìn)行驗(yàn)證。 |
no-store | 緩存不應(yīng)存儲(chǔ)有關(guān)客戶端請(qǐng)求或服務(wù)器響應(yīng)的任何內(nèi)容。 |
max-age= |
設(shè)置緩存存儲(chǔ)的最大周期,超過(guò)這個(gè)時(shí)間緩存被認(rèn)為過(guò)期(單位秒)。與Expires相反,時(shí)間是相對(duì)于請(qǐng)求的時(shí)間。 |
must-revalidate | 緩存必須在使用之前驗(yàn)證舊資源的狀態(tài),并且不可使用過(guò)期資源。 |
proxy-revalidate | 與must-revalidate作用相同,但它僅適用于共享緩存(例如代理),并被私有緩存忽略。 |
若想了解更詳細(xì)的說(shuō)明,可參考此鏈接:developer.mozilla.org/zh-CN/docs/…
ExpiresExpires 響應(yīng)頭包含日期/時(shí)間, 即在此時(shí)候之后,響應(yīng)過(guò)期。
Expires設(shè)置的值是一個(gè)絕對(duì)值。
Expires: Wed, 21 Oct 2015 07:28:00 GMTEtag
Etag HTTP響應(yīng)頭是資源的特定版本的標(biāo)識(shí)符。這可以讓緩存更高效,并節(jié)省帶寬,因?yàn)槿绻麅?nèi)容沒(méi)有改變,Web服務(wù)器不需要發(fā)送完整的響應(yīng)。而如果內(nèi)容發(fā)生了變化,使用ETag有助于防止資源的同時(shí)更新相互覆蓋(“空中碰撞”)。
Etag的值是根據(jù)資源文件內(nèi)容生成的一個(gè)hash值。
Etag: 33a64df551425fcc55e4d42a148795d9f25f89d4Last-Modified
Last-Modified包含源頭服務(wù)器認(rèn)定的資源做出修改的日期及時(shí)間。 它通常被用作一個(gè)驗(yàn)證器來(lái)判斷接收到的或者存儲(chǔ)的資源是否彼此一致。由于精確度比 ETag 要低,所以這是一個(gè)備用機(jī)制。
Last-Modified的值是一個(gè)時(shí)間的絕對(duì)值。
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMTHTTP緩存驗(yàn)證規(guī)則 HTTP緩存的驗(yàn)證順序
先使用強(qiáng)緩存(Cache-Control > Expires) 判斷資源是否過(guò)期;
若資源未過(guò)期則直接從緩存讀取,若資源過(guò)期則使用協(xié)商緩存;
使用協(xié)商緩存(Etag > Last-Modified)請(qǐng)求服務(wù)器確認(rèn)資源有無(wú)修改(請(qǐng)求頭會(huì)帶上 If-None-Match 或 If-Modified-Since);
若資源無(wú)修改則返回 304 狀態(tài)碼告訴客戶端可讀取緩存;若資源已修改則返回 200 狀態(tài)碼重新獲取資源;
圖示:
HTTP緩存驗(yàn)證說(shuō)明
以下的HTTP緩存驗(yàn)證說(shuō)明是基于假設(shè)請(qǐng)求存在4個(gè)緩存頭標(biāo)記;
HTTP緩存是否過(guò)期,先判斷Cache-Control是否設(shè)置max-age或s-max-age,如果已設(shè)置則忽略Expires并且驗(yàn)證是否過(guò)期,否則驗(yàn)證Expires是否過(guò)期;其實(shí)按照MDN文檔的說(shuō)明,Last-Modified也是可以計(jì)算出一個(gè)緩存時(shí)間;
下面是MDN文檔的說(shuō)明:
對(duì)于含有特定頭信息的請(qǐng)求,會(huì)去計(jì)算緩存壽命。比如Cache-control: max-age=N的頭,相應(yīng)的緩存的壽命就是N。通常情況下,對(duì)于不含這個(gè)屬性的請(qǐng)求則會(huì)去查看是否包含Expires屬性,通過(guò)比較Expires的值和頭里面Date屬性的值來(lái)判斷是否緩存還有效。如果max-age和expires屬性都沒(méi)有,找找頭里的Last-Modified信息。如果有,緩存的壽命就等于頭里面Date的值減去Last-Modified的值除以10(注:根據(jù)rfc2626其實(shí)也就是乘以10%)。
緩存時(shí)間計(jì)算公式:
expirationTime = responseTime + freshnessLifetime - currentAge
如果該緩存未過(guò)期,是不會(huì)向服務(wù)器發(fā)送請(qǐng)求的,而是直接從緩存中讀取,也就是我們可以從HTTP請(qǐng)求信息里得到的狀態(tài)碼 200 (from cache memory || from disk memory) ,如果緩存過(guò)期,則使用協(xié)商緩存;
先嘗試從內(nèi)存中讀取,再嘗試從硬盤中讀取。
200 form memory cache 不訪問(wèn)服務(wù)器,一般已經(jīng)加載過(guò)該資源且緩存在了內(nèi)存當(dāng)中,直接從內(nèi)存中讀取緩存。瀏覽器關(guān)閉后,數(shù)據(jù)將不存在(資源被釋放掉了),再次打開相同的頁(yè)面時(shí),不會(huì)出現(xiàn)from memory cache。
200 from disk cache 不訪問(wèn)服務(wù)器,已經(jīng)在之前的某個(gè)時(shí)間加載過(guò)該資源,直接從硬盤中讀取緩存,關(guān)閉瀏覽器后,數(shù)據(jù)依然存在,此資源不會(huì)隨著該頁(yè)面的關(guān)閉而釋放掉下次打開仍然會(huì)是from disk cache。
使用協(xié)商緩存驗(yàn)證緩存資源是否修改;Etag > Last-Modified,當(dāng)存在Etag則使用Etag,否則使用Last-Modified;并且請(qǐng)求時(shí)會(huì)帶上特定的標(biāo)識(shí);
Etag 請(qǐng)求時(shí)會(huì)帶上 If-None-Match
Last-Modified 請(qǐng)求時(shí)會(huì)帶上 If-Modified-Since
當(dāng)確認(rèn)資源未修改時(shí)則返回 304 (Not Modified)告訴客戶端可以繼續(xù)使用緩存,否則返回200重新獲取新的資源。
HTTP緩存早期的時(shí)候只有Expires和Last-Modified,為什么后面又會(huì)出現(xiàn)Cache-Control和Etag呢?
先說(shuō)說(shuō)Expires和Cache-Control,Expires的值是一個(gè)準(zhǔn)確的時(shí)間,比較的時(shí)候先根據(jù)返回頭的Date值比較判斷,但是若無(wú)Date頭信息返回則是根據(jù)客戶端的本地時(shí)間進(jìn)行比較;本地時(shí)間因?yàn)楦鞣N因素影響,會(huì)存在各種不同的值,導(dǎo)致Expires緩存的時(shí)間并不是我們想要的效果。而Cache-Control設(shè)置max-age使用的相對(duì)值則相對(duì)來(lái)說(shuō)控制粒度更精確了;并且Cache-Control的其他值則讓我們對(duì)于緩存的控制更加靈活。
再說(shuō)說(shuō)Last-Modified和Etag,Last-Modified的值也是一個(gè)準(zhǔn)確的時(shí)間,精確到秒;使用時(shí)間來(lái)判斷資源是否修改則可能存在以下問(wèn)題:
1秒內(nèi)的修改可能不被檢查到,導(dǎo)致緩存無(wú)法更新;
資源可能只是多了幾個(gè)空格或無(wú)變化,但是Last-Modified的時(shí)間已經(jīng)變化;
針對(duì)以上的問(wèn)題所以有了Etag的存在,Etag是根據(jù)資源內(nèi)容生成的hash值對(duì)比判斷資源是否更新,控制粒度比Last-Modified更加精確。
總結(jié)HTTP緩存的本質(zhì)上是以空間換時(shí)間,緩存的存在是為了盡可能的減少HTTP請(qǐng)求次數(shù)和HTTP傳輸?shù)膬?nèi)容大小,這也是前端性能優(yōu)化中重要的一環(huán)。合理的設(shè)置頁(yè)面資源的緩存,有助你提升頁(yè)面的體驗(yàn)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/6779.html
摘要:基礎(chǔ),超文本傳輸協(xié)議。不驗(yàn)證通信方的身份,通信方的身份有可能遭遇偽裝。無(wú)法證明報(bào)文的完整性,報(bào)文有可能遭篡改。多路復(fù)用,支持單個(gè)連接多次請(qǐng)求,即連接共享,即每一個(gè)都是是用作連接共享機(jī)制的。 走在前端的大道上 本篇將自己讀過(guò)的相關(guān) http/https 方法 文章中,對(duì)自己有啟發(fā)的章節(jié)片段總結(jié)在這(會(huì)對(duì)原文進(jìn)行刪改),會(huì)不斷豐富提煉總結(jié)更新。 Web 基礎(chǔ) HTTP(HyperText...
摘要:談起閉包,它可是兩個(gè)核心技術(shù)之一異步基于打造前端持續(xù)集成開發(fā)環(huán)境本文將以一個(gè)標(biāo)準(zhǔn)的項(xiàng)目為例,完全拋棄傳統(tǒng)的前端項(xiàng)目開發(fā)部署方式,基于容器技術(shù)打造一個(gè)精簡(jiǎn)的前端持續(xù)集成的開發(fā)環(huán)境。 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果讀完本文還不懂,可以揍我。 不論你是javascript新手還是老鳥,不論是面試求職,還是日...
摘要:的選擇器允許單個(gè)線程監(jiān)視多個(gè)輸入通道。一旦執(zhí)行的線程已經(jīng)超過(guò)讀取代碼中的某個(gè)數(shù)據(jù)片段,該線程就不會(huì)在數(shù)據(jù)中向后移動(dòng)通常不會(huì)。 1、引言 很多初涉網(wǎng)絡(luò)編程的程序員,在研究Java NIO(即異步IO)和經(jīng)典IO(也就是常說(shuō)的阻塞式IO)的API時(shí),很快就會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題:我什么時(shí)候應(yīng)該使用經(jīng)典IO,什么時(shí)候應(yīng)該使用NIO? 在本文中,將嘗試用簡(jiǎn)明扼要的文字,闡明Java NIO和經(jīng)典IO之...
閱讀 2390·2021-11-24 09:39
閱讀 2596·2021-11-22 15:24
閱讀 3041·2021-09-02 09:48
閱讀 3096·2021-07-26 22:01
閱讀 1498·2019-08-30 11:09
閱讀 1737·2019-08-29 18:47
閱讀 666·2019-08-29 15:40
閱讀 2186·2019-08-29 15:22