真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

HTTP緩存策略是什么

這篇文章主要講解了“HTTP緩存策略是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“HTTP緩存策略是什么”吧!

成都創(chuàng)新互聯(lián)公司自成立以來(lái),一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開(kāi)發(fā)等基于互聯(lián)網(wǎng)的全面整合營(yíng)銷(xiāo)服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開(kāi)發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開(kāi)發(fā)工程師團(tuán)隊(duì)及專(zhuān)業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。

我就跟朋友討論了一下HTTP的緩存策略:

朋友說(shuō):“HTTP里面控制緩存的頭(header)太多了,啥Cache-Control,ETag,Last-Modified,一大堆,亂七八糟的,而且之間邏輯關(guān)系不強(qiáng),要掌握基本靠背!”

我有點(diǎn)驚訝:“為什么要去背這個(gè)呢?所有的技術(shù)都是為了解決問(wèn)題而存在的,不了解問(wèn)題而去單純的學(xué)習(xí)技術(shù),去,背,去,死記,確實(shí)很枯燥,而且效果不好。HTTP緩存策略只是為了解決客戶(hù)端和服務(wù)端信息不對(duì)稱(chēng)的問(wèn)題而存在的,客戶(hù)端為了加快速度會(huì)緩存部分資源,但是下次請(qǐng)求時(shí),客戶(hù)端不知道這個(gè)資源有沒(méi)有更新,服務(wù)端也不知道客戶(hù)端緩存的是哪個(gè)版本,不知道該不該再返回資源,其實(shí)就是一個(gè)信息同步問(wèn)題,HTTP緩存策略就是來(lái)解決這個(gè)問(wèn)題的。如果我們跳出這種純粹的技術(shù)思維,我們會(huì)發(fā)現(xiàn)生活中這種信息同步問(wèn)題也很常見(jiàn)。而我們解決這些問(wèn)題的思路很多時(shí)候都是司空見(jiàn)慣了,如果從這個(gè)角度來(lái)說(shuō),這個(gè)問(wèn)題就很好理解!”

于是我給他講了一個(gè)我小時(shí)候租光碟看奧特曼的故事。

租光碟看奧特曼

事情是這樣的,我小時(shí)候特別喜歡看動(dòng)畫(huà)片,尤其是奧特曼,但是那時(shí)候沒(méi)有電腦啊,也沒(méi)有網(wǎng)絡(luò)。我只有一臺(tái)DVD播放機(jī),于是我會(huì)經(jīng)常跑去租光碟的店租奧特曼。

ETag

某天,我看完了《艾斯奧特曼》第10集,我還想繼續(xù)看。于是我找到了光碟店的老板:“老板,第10集我看完了哦,你還有沒(méi)有新的啊?”老板說(shuō):“有有有,剛出了第11集,你拿去吧!”

上面這一個(gè)簡(jiǎn)單的交流過(guò)程其實(shí)就包含了一個(gè)HTTP的緩存技術(shù),那就是ETag!類(lèi)比于網(wǎng)絡(luò)請(qǐng)求,我其實(shí)就是客戶(hù)端,光碟店就是服務(wù)端,我去租光碟就相當(dāng)于發(fā)起一個(gè)請(qǐng)求。但是我去租光碟時(shí),老板并不知道我看到哪集了,我們的信息是不同步的。所以我告訴了他一個(gè)標(biāo)記(Tag),在這里這個(gè)標(biāo)記就是第10集,老板拿到這個(gè)標(biāo)記,跟他自己庫(kù)存的標(biāo)記比較一下,發(fā)現(xiàn)他最新標(biāo)記是第11集,于是知道有更新了,將第11集給了我。

Last-Modified & If-Modified-Since

再來(lái),我《艾斯奧特曼》看完了,我開(kāi)始看《泰羅奧特曼》了??墒抢习暹@次比較雞賊,《泰羅奧特曼》沒(méi)買(mǎi)正版的,是他自己翻錄的,他翻錄的時(shí)候自己也不知道是第幾集,但是他聰明的在光盤(pán)上寫(xiě)上了翻錄日期。于是我正在看的這盤(pán)也沒(méi)啥封面,只光禿禿的寫(xiě)了一個(gè)2000年12月1日。當(dāng)我這盤(pán)看完了,我又去找老板了:“老板,你這個(gè)2000年12月1日的我已經(jīng)看完了,你還有沒(méi)有新的???”這里的2000年12月1日其實(shí)就是標(biāo)記了我手上副本的更新日期,這也對(duì)應(yīng)了HTTP的一個(gè)緩存技術(shù),那就是Last-ModifiedIf-Modified-Since。你可以理解為,老板給日期還取了一個(gè)名字,叫Last-Modified,所以光碟上完整文字是Last-Modified:2000年12月1日,而我去問(wèn)的時(shí)候就這么問(wèn):“Do you have any updates IF-Modified-Since 2000年12月1日?”。

Expires和Max-Age

繼續(xù),我《泰羅奧特曼》也看完了,開(kāi)始看《雷歐奧特曼》了。這《雷歐奧特曼》跟前面兩個(gè)都不一樣,我去租的時(shí)候老板就說(shuō)了:“你小子別天天跑來(lái)問(wèn)了!《雷歐奧特曼》我每周去進(jìn)一次貨,你每周一來(lái)拿就行!”這句話(huà)也對(duì)應(yīng)了一個(gè)HTTP緩存技術(shù),那就是ExpiresMax-Age。我知道了下周一之前,我手上都是最新的,到了下周一就過(guò)期(Expire)了。所以“我手上的是最新的”這個(gè)說(shuō)法有個(gè)生命周期,他的年齡是有限的,他的年齡等于下周一更新時(shí)間減去當(dāng)前時(shí)間,這就是他的最大年齡(Max-Age)。

Immutable

再來(lái)一個(gè),我《雷歐奧特曼》也看完了,開(kāi)始看《奈克斯特奧特曼》了。這《奈克斯特奧特曼》跟前面幾個(gè)都不一樣,我去租的時(shí)候老板說(shuō)了:“小子,你這次運(yùn)氣好,這《奈克斯特奧特曼》已經(jīng)出完了,你全部拿去吧,也不用天天跑來(lái)問(wèn)了!”這句話(huà)對(duì)應(yīng)的HTTP緩存技術(shù)是啥?當(dāng)然是ImmutableImmutable就跟字面意思一樣,不可變的!就像《奈克斯特奧特曼》一樣,已經(jīng)出完了,不用再去問(wèn)更新了。

言歸正傳

扯蛋到這里結(jié)束,咱們言歸正傳!之所以舉這么個(gè)例子,是為了說(shuō)明HTTP緩存技術(shù)要解決的問(wèn)題在生活中很常見(jiàn),從這些常見(jiàn)的場(chǎng)景入手,理解起來(lái)更簡(jiǎn)單。下面我們正兒八經(jīng)的來(lái)說(shuō)說(shuō)HTTP緩存技術(shù):

兩種機(jī)制

從上面的幾個(gè)小例子可以看出,有時(shí)候?yàn)榱酥朗遣皇怯懈拢冶仨毴?wèn)老板,比如第一個(gè)例子里面:“老板,第10集我看完了哦,你還有沒(méi)有新的?。俊?。這種為了知道有沒(méi)有更新,必須跟服務(wù)端溝通過(guò)才知道的,我們稱(chēng)之為協(xié)商緩存。還有些場(chǎng)景,我不去問(wèn)就知道有沒(méi)有更新,比如第三個(gè)例子,因?yàn)橹朗侵芨?,?dāng)周一來(lái)之前,我都不會(huì)去問(wèn)了,到了周一再去問(wèn),這種不用跟服務(wù)器協(xié)商直接用本地副本的叫做強(qiáng)制緩存。換成技術(shù)的話(huà)說(shuō)就是,強(qiáng)制緩存不用發(fā)請(qǐng)求直接用本地緩存,協(xié)商緩存要發(fā)請(qǐng)求去問(wèn)服務(wù)器有沒(méi)有更新。下面我們?cè)敿?xì)來(lái)講下這兩種緩存:

協(xié)商緩存

前面第一個(gè)例子和第二個(gè)例子每次都需要向服務(wù)器端詢(xún)問(wèn),所以是協(xié)商緩存。

ETag和If-None-Match

ETag是URL的Entity Tag,就是一個(gè)URL資源的標(biāo)識(shí)符,類(lèi)似于文件的md5,計(jì)算方式也類(lèi)似,當(dāng)服務(wù)器返回時(shí),可以根據(jù)返回內(nèi)容計(jì)算一個(gè)hash值或者就是一個(gè)數(shù)字版本號(hào),類(lèi)似于我們的第10集,具體返回什么值要看服務(wù)器的計(jì)算策略。然后將它加到responseheader里面,可能長(zhǎng)這樣:

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

客戶(hù)端拿到后會(huì)將這個(gè)ETag和返回值一起存下來(lái),等下次請(qǐng)求時(shí),使用配套的If-None-Match,將這個(gè)放到requestheader里面,可能長(zhǎng)這樣:

If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

然后服務(wù)端拿到請(qǐng)求里面的If-None-Match跟當(dāng)前版本的ETag比較下:

  1. 如果是一樣的話(huà),直接返回304,語(yǔ)義為Not Modified,不返回內(nèi)容(body),只返回header,告訴瀏覽器直接用緩存。

  2. 如果不一樣的話(huà),返回200和最新的內(nèi)容

ETag配套的還有一個(gè)不太常用的request header ----If-Match,這個(gè)和前面If-None-Match的語(yǔ)義是相反的。前面If-None-Match的語(yǔ)義是如果不匹配就下載。而If-Match通常用于post或者put請(qǐng)求中,語(yǔ)義為如果匹配才提交,比如你在編輯一個(gè)商品,其他人也可能同時(shí)在編輯。當(dāng)你提交編輯時(shí),其他人可能已經(jīng)先于你提交了,這時(shí)候服務(wù)端的ETag就已經(jīng)變了,If-Match就不成立了,這時(shí)候服務(wù)端會(huì)給你返回412錯(cuò)誤,也就是Precondition Failed,前提條件失敗。如果If-Match成立,就正常返回200。

Last-Modified & If-Modified-Since

Last-ModifiedIf-Modified-Since也是配套使用的,類(lèi)似于ETagIf-None-Match的關(guān)系。只不過(guò)ETag放的是一個(gè)版本號(hào)或者hash值,Last-Modified放的是資源的最后修改時(shí)間。Last-Modified是放到responseheader里面的,可能長(zhǎng)這樣:

Last-Modified: Wed, 21 Oct 2000 07:28:00 GMT

而客戶(hù)端瀏覽器在使用時(shí),應(yīng)該將配套的If-Modified-Since放到**requestheader里面**,長(zhǎng)這樣:

If-Modified-Since: Wed, 21 Oct 2000 07:28:00 GMT

服務(wù)端拿到這個(gè)頭后,會(huì)跟當(dāng)前版本的修改時(shí)間進(jìn)行比較:

  1. 當(dāng)前版本的修改時(shí)間比這個(gè)晚,也就是這個(gè)時(shí)間后又改過(guò)了,返回200和新的內(nèi)容

  2. 當(dāng)前版本的修改時(shí)間和這個(gè)一樣,也就是沒(méi)有更新,返回304,不返回內(nèi)容,只返回頭,客戶(hù)端直接使用緩存

If-Modified-Since對(duì)應(yīng)的還有If-Unmodified-SinceIf-Modified-Since可以理解為有更新才下載,那If-Unmodified-Since就是沒(méi)有更新才下載。如果客戶(hù)端傳了If-Unmodified-Since,像這樣:

If-Unmodified-Since: Wed, 21 Oct 2000 07:28:00 GMT

服務(wù)端拿到這個(gè)頭后,也會(huì)跟當(dāng)前版本的修改時(shí)間進(jìn)行比較:

  1. 如果這個(gè)時(shí)間后沒(méi)有更新,服務(wù)器返回200,并返回內(nèi)容。

  2. 如果這個(gè)時(shí)間后有更新,其實(shí)就是這個(gè)if不成立,會(huì)返回錯(cuò)誤代碼412,語(yǔ)義為Precondition Failed

ETag和Last-Modified優(yōu)先級(jí)

ETagLast-Modified都是協(xié)商緩存,都需要服務(wù)器進(jìn)行計(jì)算和比較,那如果這兩個(gè)都存在,用哪個(gè)呢?答案是ETag,ETag的優(yōu)先級(jí)比Last-Modified。因?yàn)?code>Last-Modified在設(shè)計(jì)上有個(gè)問(wèn)題,那就是Last-Modified的精度只能到秒,如果一個(gè)資源頻繁修改,在同一秒進(jìn)行多次修改,你從Last-Modified上是看不出來(lái)區(qū)別的。但是ETag每次修改都會(huì)生成新的,所以他比Last-Modified精度高,更準(zhǔn)確。但是ETag也不是完全沒(méi)問(wèn)題的,你的ETag如果設(shè)計(jì)為一個(gè)hash值,每次請(qǐng)求都要計(jì)算這個(gè)值,需要額外耗費(fèi)服務(wù)器資源。具體使用哪一個(gè),需要根據(jù)自己的項(xiàng)目情況來(lái)進(jìn)行取舍。

強(qiáng)制緩存

上面扯蛋那里的第三個(gè)例子和第四個(gè)例子就是強(qiáng)制緩存,就是我知道在某個(gè)時(shí)間段完全不用去問(wèn)服務(wù)端,直接去用緩存就行。這兩個(gè)例子里面提到的Expires是一個(gè)單獨(dú)的header,max-ageimmutable同屬于Cache-Control這個(gè)header。

Expires

Expires比較簡(jiǎn)單,就是服務(wù)器responseheader帶上這個(gè)字段:

Expires: Wed, 21 Oct 2000 07:28:00 GMT

然后在這個(gè)時(shí)間前,客戶(hù)端瀏覽器都不會(huì)再發(fā)起請(qǐng)求,而是直接用緩存資源。

Cache-Control

Cache-Control相對(duì)比較復(fù)雜,可設(shè)置屬性也比較多,max-age只是其中一個(gè)屬性,長(zhǎng)這樣:

Cache-Control: max-age=20000

這表示當(dāng)前資源在20000秒內(nèi)都不用再請(qǐng)求了,直接使用緩存。

上面提到的immutable也是Cache-Control的一個(gè)屬性,但是是個(gè)實(shí)驗(yàn)性質(zhì)的,各個(gè)瀏覽器兼容并不好。設(shè)置了Cache-control: immutable表示這輩子都用緩存了,再請(qǐng)求是不可能的了。

其他常用屬性還有:

no-cache:使用緩存前,強(qiáng)制要求把請(qǐng)求提交給服務(wù)器進(jìn)行驗(yàn)證(協(xié)商緩存驗(yàn)證)。

no-store:不存儲(chǔ)有關(guān)客戶(hù)端請(qǐng)求或服務(wù)器響應(yīng)的任何內(nèi)容,即不使用任何緩存。

另外Cache-Control還有很多屬性,大家可以參考MDN的文檔。

Expires和Cache-Control的優(yōu)先級(jí)

就一句話(huà):如果在Cache-Control響應(yīng)頭設(shè)置了 max-age 或者 s-maxage 指令,那么 Expires 頭會(huì)被忽略。

協(xié)商緩存和強(qiáng)制緩存優(yōu)先級(jí)

這個(gè)其實(shí)很好理解,協(xié)商緩存需要發(fā)請(qǐng)求跟服務(wù)器協(xié)商,強(qiáng)制緩存如果生效,根本就不會(huì)發(fā)請(qǐng)求。所以這個(gè)優(yōu)先級(jí)就是:先判斷強(qiáng)制緩存,如果強(qiáng)制緩存生效,直接使用緩存;如果強(qiáng)制緩存失效,再發(fā)請(qǐng)求跟服務(wù)器協(xié)商,看要不要使用緩存

感謝各位的閱讀,以上就是“HTTP緩存策略是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)HTTP緩存策略是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


網(wǎng)站欄目:HTTP緩存策略是什么
當(dāng)前鏈接:http://weahome.cn/article/johgei.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部