摘要:但遺憾的是,該響應(yīng)已經(jīng)過(guò)期。大多數(shù)情況下,不是必需的,因?yàn)槊鞔_的緩存信息例如已表示響應(yīng)是可以緩存的。表示響應(yīng)只為單個(gè)用戶(hù)緩存,因此不允許中間緩存對(duì)其進(jìn)行緩存。這樣,即使文件緩存了,也可以得到更新。
在上一篇文章中,我們講到造成網(wǎng)絡(luò)性能下降的主要原因是延遲,而非帶寬。那么為了更好地讓我們的網(wǎng)站能快速響應(yīng)用戶(hù)的請(qǐng)求,我們就必須對(duì)一些常用資源進(jìn)行緩存,
以免每次用戶(hù)訪問(wèn)都請(qǐng)求一遍,這也是網(wǎng)站性能優(yōu)化比較重要的一個(gè)環(huán)節(jié)。
現(xiàn)代瀏覽器都自帶了HTTP緩存實(shí)現(xiàn)功能,我們所要做的只是確保我們正確地設(shè)置了HTTP響應(yīng)頭,以便指示瀏覽器何時(shí)緩存響應(yīng)以及緩存多久。
首先說(shuō)明一點(diǎn),緩存并不是說(shuō)瀏覽器不會(huì)對(duì)該資源再次發(fā)起請(qǐng)求,每種緩存機(jī)制都有自己的過(guò)期策略,我們常常看到的304狀態(tài)碼就表面該資源已被緩存了,但瀏覽器不知道有沒(méi)有過(guò)期,
再次使用該資源的時(shí)候,會(huì)向服務(wù)器發(fā)起請(qǐng)求驗(yàn)證一遍,如果緩存資源有效,則會(huì)返回304狀態(tài)碼。最壞的情況下,則是該資源過(guò)期了,還得重新發(fā)起一次請(qǐng)求去獲取。另一種則是瀏覽
器連問(wèn)都不問(wèn)服務(wù)器,直接就從本地硬盤(pán)讀取,此時(shí)可以看到瀏覽器給出的響應(yīng)是200(from disk cache)。
假設(shè)我們有一份css資源,我們?cè)讷@取該資源一段時(shí)間后又刷新了頁(yè)面,這時(shí)瀏覽器就會(huì)檢查本地資源并查找之前的響應(yīng)。但遺憾的是,該響應(yīng)已經(jīng)過(guò)期。此時(shí),瀏覽器可以直接發(fā)起請(qǐng)求
重新去獲取一份新的數(shù)據(jù),但這樣做效率實(shí)在是太低了。若資源本身改變了還好說(shuō),但若資源本身并沒(méi)有改變呢,重新獲取一份數(shù)據(jù)成本太高。
這時(shí)ETag就是用來(lái)解決這個(gè)問(wèn)題的,ETag可以看做是這個(gè)文件的hash值,只要文件內(nèi)容沒(méi)有改變,ETag值則不會(huì)變。客戶(hù)端完全不需要了解ETag是怎么生成的,只需要在下一次請(qǐng)求的
時(shí)候?qū)Tag帶上即可(瀏覽器發(fā)起請(qǐng)求時(shí),if-None-Match中的值就是該ETag值),若該ETag與服務(wù)器匹配,則會(huì)返回304,告訴瀏覽器可以使用該緩存,從而跳過(guò)再次下載過(guò)程。
Cache-Control指令控制誰(shuí)在什么條件下可以緩存響應(yīng)以及可以緩存多久,如上面所說(shuō),有些資源我們可以直接從本地磁盤(pán)獲取(from disk cache),而無(wú)需再次發(fā)起請(qǐng)求詢(xún)問(wèn)服務(wù)器,這
便是Cache-Control的作用。Cache-Control是HTTP/1.1規(guī)范中定義的,現(xiàn)在基本用它來(lái)取代Expires。
"no-cahce"與"no-store"
"no-cache"表示必須與服務(wù)器確認(rèn)返回的響應(yīng)是否發(fā)生了變化,然后才能使用該響應(yīng)來(lái)滿(mǎn)足后續(xù)對(duì)同一資源的請(qǐng)求。該值可以配合ETag來(lái)使用,瀏覽器通過(guò)請(qǐng)求If-None-Match來(lái)向服務(wù)器
驗(yàn)證該資源是否過(guò)期,若資源未發(fā)生變化,則避免下載。
"no-store"則表示無(wú)論什么情況下,瀏覽器都不得緩存該資源,即便存在ETag也一樣,每次都得從服務(wù)器中獲取。
"public"與"private"
如果響應(yīng)被標(biāo)記為"public",則即使它有關(guān)聯(lián)的 HTTP 身份驗(yàn)證,甚至響應(yīng)狀態(tài)代碼通常無(wú)法緩存,也可以緩存響應(yīng)。大多數(shù)情況下,“public”不是必需的,因?yàn)槊鞔_的緩存信息(例如“max-age”)
已表示響應(yīng)是可以緩存的。
"private"表示響應(yīng)只為單個(gè)用戶(hù)緩存,因此不允許中間緩存對(duì)其進(jìn)行緩存。例如,用戶(hù)瀏覽器可以緩存包含用戶(hù)私人信息的HTML網(wǎng)頁(yè),但CDN則不可以。
"max-age"
該值是Cache-Control中用得比較多的一個(gè)值,表示從請(qǐng)求的時(shí)間開(kāi)始,允許獲取的響應(yīng)被緩存的最長(zhǎng)時(shí)間(單位:秒)。例如,max-age設(shè)置為100,則表示該資源可以緩存100秒,100秒后,再次
請(qǐng)求該資源,瀏覽器則會(huì)攜帶ETag去詢(xún)問(wèn)服務(wù)器該資源是否過(guò)期。在該資源未過(guò)期時(shí),訪問(wèn)該資源,瀏覽器則從本地磁盤(pán)獲取,不會(huì)發(fā)起任何網(wǎng)絡(luò)請(qǐng)求。
如上圖所示,如果資源不需要緩存,我們?cè)O(shè)置Cache-Control的值為no-store;如果資源需要緩存且每次都得向服務(wù)器驗(yàn)證,則為no-cache;如果中間設(shè)備可以緩存,設(shè)置為public,中間設(shè)備不
可緩存,設(shè)置為private;如果緩存有時(shí)間限制,我們?cè)O(shè)置max-age的值。private與public的值可以與max-age同時(shí)使用,中間用分號(hào)隔開(kāi)。
Expires頭指定了一個(gè)日期/時(shí)間,在這個(gè)日期/時(shí)間之后,HTTP響應(yīng)被認(rèn)為是過(guò)時(shí)的,一個(gè)無(wú)效的日期,例如0也表示該資源過(guò)時(shí)。如果還設(shè)置了max-age,則該請(qǐng)求頭會(huì)被忽略。
總結(jié)使用緩存最好的方式就是ETag配合Cache-Control,并設(shè)置相應(yīng)的max-age,一般情況下,不再建議使用Expires頭。如果資源許久都不更新,max-age可以設(shè)置比較長(zhǎng)的時(shí)間,但是這樣會(huì)有個(gè)問(wèn)題就是
在緩存期間,該文件發(fā)生改變,但相應(yīng)的客戶(hù)端卻還是在使用舊版本,解決的方法就是每個(gè)文件都帶一個(gè)相應(yīng)內(nèi)容的hash值作為文件名。這樣,即使文件緩存了,也可以得到更新。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/61913.html
摘要:原文地址游客前言金三銀四,很多同學(xué)心里大概都準(zhǔn)備著年后找工作或者跳槽。最近有很多同學(xué)都在交流群里求大廠面試題。 最近整理了一波面試題,包括安卓JAVA方面的,目前大廠還是以安卓源碼,算法,以及數(shù)據(jù)結(jié)構(gòu)為主,有一些中小型公司也會(huì)問(wèn)到混合開(kāi)發(fā)的知識(shí),至于我為什么傾向于混合開(kāi)發(fā),我的一句話(huà)就是走上編程之路,將來(lái)你要學(xué)不僅僅是這些,豐富自己方能與世接軌,做好全棧的裝備。 原文地址:游客kutd...
摘要:重要的模塊化規(guī)范有幾個(gè),模塊機(jī)制,,。模塊化的目的在于營(yíng)造安全封閉的作用域且具有易于引用接口,按我的理解可分為模塊定義模塊引入兩部分。它的定義如下模塊標(biāo)識(shí)符模塊對(duì)外輸出的值調(diào)用該模塊的模塊。在中,有一部分模塊由提供,稱(chēng)之為核心模塊。 重要的模塊化規(guī)范有幾個(gè):commonjs,ES6模塊機(jī)制,AMD,CMD。由于業(yè)務(wù)中一直接觸的都是Vue+webpack+babel架構(gòu)的項(xiàng)目,在封裝代碼...
閱讀 3099·2021-08-03 14:05
閱讀 2144·2019-08-29 15:35
閱讀 683·2019-08-29 13:30
閱讀 3172·2019-08-29 13:20
閱讀 2534·2019-08-23 18:15
閱讀 1802·2019-08-23 14:57
閱讀 2220·2019-08-23 13:57
閱讀 1315·2019-08-23 12:10