成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

http緩存深入研究,200 from cache or 304 not modified?

binaryTree / 2102人閱讀

摘要:我把緩存分為緩存存儲(chǔ)緩存對(duì)比兩部分。不過是的東西,現(xiàn)在默認(rèn)瀏覽器均默認(rèn)使用,所以它的作用基本忽略。當(dāng)資源發(fā)送改變時(shí),也隨之發(fā)生變化。關(guān)于版本號(hào)建議使用的形式而不是。

前幾天看到一篇關(guān)于緩存的文章徹底弄懂 Http 緩存機(jī)制 - 基于緩存策略三要素分解法,覺得很有意思,所以打算系統(tǒng)學(xué)習(xí)下Http緩存相關(guān)的知識(shí)。

我把緩存分為緩存存儲(chǔ)緩存對(duì)比兩部分。

基本概念

命中緩存速度對(duì)比

200 from cache? vs ?304 Not Modified?

思考:localStorage存儲(chǔ)

(一)基本概念 (1)緩存存儲(chǔ)

Pragma : no-cache ?http1.0時(shí)期的屬性? 為了兼容會(huì)使用

Expires:0 ?http1.0時(shí)期的屬性?

Cache-Control ?http1.1?中加入的新屬性,它有以下常用參數(shù):

Public/Private 私有緩存/共有緩存

no-cache:不建議使用本地緩存,但仍然會(huì)緩存到本地

no-store:不會(huì)在客戶端緩存任何數(shù)據(jù)

max-age:比較特殊,是一個(gè)混合屬性,替代了Expires的過期時(shí)間

舉個(gè)栗子:如果要設(shè)置客戶端不緩存,并兼容http1.0的方式可以這樣寫:

Pragma : no-cache 
Expires:0
Cache-Control:no-store

等價(jià)于

Pragma : no-cache  // Pragma為了兼容http1.0
Cache-Control:max-age=0  // 去掉了Expires屬性(下面名詞解釋會(huì)說到為什么被去掉),合并到max-age中,

名詞解釋:
私有緩存:《HTTP權(quán)威指南》里面講到了私有緩存的一種就是在瀏覽器里面輸入 ?about:cache? 可以查看自己瀏覽器緩存的內(nèi)容,會(huì)給出一個(gè)顯示了緩存內(nèi)容“磁盤緩存統(tǒng)計(jì)”頁面,這個(gè)可以看看還挺有意思,能展示不少信息
Expires:過時(shí)期限值,GMT格式,是Web服務(wù)器響應(yīng)消息頭字段,在響應(yīng)http請(qǐng)求時(shí)告訴瀏覽器在過期時(shí)間前瀏覽器可以直接從瀏覽器緩存取數(shù)據(jù),而無需再次請(qǐng)求。不過Expires 是HTTP 1.0的東西,現(xiàn)在默認(rèn)瀏覽器均默認(rèn)使用HTTP 1.1,所以它的作用基本忽略。Expires 的一個(gè)缺點(diǎn)就是,返回的到期時(shí)間是服務(wù)器端的時(shí)間,這樣存在一個(gè)問題,如果客戶端的時(shí)間與服務(wù)器的時(shí)間相差很大(比如時(shí)鐘不同步,或者跨時(shí)區(qū)),那么誤差就很大,所以在HTTP 1.1版開始,使用Cache-Control: max-age=秒替代。

(2)緩存對(duì)比

Last-Modified ?http1.0時(shí)期屬性? 現(xiàn)在仍在使用

ETag(Entity Tag) ?http1.1時(shí)期新加屬性?,使用inode+mtime(以下有解釋)來計(jì)算。根據(jù)實(shí)體內(nèi)容生成的一段hash字符串(類似于MD5或者SHA1之后的結(jié)果),可以標(biāo)識(shí)資源的狀態(tài)。 當(dāng)資源發(fā)送改變時(shí),ETag也隨之發(fā)生變化。

名詞解釋:
inode :包含文件的元信息,包括以下內(nèi)容

文件的字節(jié)數(shù)、文件擁有者的User ID、文件的Group ID

文件的讀、寫、執(zhí)行權(quán)限

文件的時(shí)間戳,共有三個(gè):ctime指inode上一次變動(dòng)的時(shí)間,mtime指文>件內(nèi)容上一次變動(dòng)的時(shí)間,atime指文件上一次打開的時(shí)間。

鏈接數(shù),即有多少文件名指向這個(gè)inode、 文件數(shù)據(jù)block的位置
mtime:指文件內(nèi)容上一次變動(dòng)的時(shí)間

2.1為什么用http1.1新推出了ETag

某些服務(wù)器不能精確得到文件的最后修改時(shí)間, 這樣就無法通過最后修改時(shí)間來判斷文件是否更新了。

某些文件的修改非常頻繁,在秒以下的時(shí)間內(nèi)進(jìn)行修改. Last-Modified只能精確到秒。

一些文件的最后修改時(shí)間改變了,但是內(nèi)容并未改變。 我們不希望客戶端認(rèn)為這個(gè)文件修改了。

2.2ETag有哪些問題

ETag也有他自己的問題,所以經(jīng)常在使用中會(huì)關(guān)閉ETag。舉例來說,同一個(gè)文件在不同物理機(jī)上的inode是不同的,這就導(dǎo)致了在分布式的Web系統(tǒng)中,當(dāng)訪問落在不同的物理機(jī)上時(shí)會(huì)返回不同的ETag,進(jìn)而導(dǎo)致304失效,降級(jí)為200請(qǐng)求。解決辦法也有從ETag算法中剝離inode,只是使用mtime,但是這樣實(shí)際上和Last-Modified就一樣了。當(dāng)然你也可以額外的做一些改進(jìn),使ETag對(duì)靜態(tài)資源的算法也是通過hash計(jì)算的。不過由于一般我們會(huì)使用CDN技術(shù),因此集群部署中的ETag問題并不會(huì)造成太大的影響,所以折騰的人也不太是很多。 ?參考:這篇文章hefangshi同學(xué)的回答

(二)命中緩存速度對(duì)比

圖片描述
引一張《HTTP權(quán)威指南》中的一張圖,可以看出命中緩存過程:

(1)緩存命中速度

緩存命中 > 緩存再驗(yàn)證成功 > 緩存未命中 = 緩存再驗(yàn)證失?。?/p>

1.1緩存命中優(yōu)先級(jí)

Cache-Control http1.1 > Expires > Pragma http1.0來決定是否 (200 from cache)

1.2緩存再驗(yàn)證成功

根據(jù)Last-Modified http1.0 和 ETaghttp1.1 來驗(yàn)證是否返回 (304 Not Modified) 兩者都有,就必須同時(shí)驗(yàn)證,并且兩者都滿足才會(huì)返回304;

圖片描述

服務(wù)端響應(yīng)頭 Last-Modified 與 客戶端請(qǐng)求頭 If-Modified-Since 對(duì)應(yīng)

服務(wù)端響應(yīng)頭 ETag 與 客戶端請(qǐng)求頭 If-None-Match

(三) 200 from cache vs 304 Not Modified

為什么有時(shí)候明明命中了緩存,控制臺(tái)中Status顯示的不是 200 from cache??原來是瀏覽器的原因:

觸發(fā) 200 from cache:

直接點(diǎn)擊鏈接訪問

輸入網(wǎng)址按回車訪問

二維碼掃描

觸發(fā) 304 Not Modified:

刷新頁面時(shí)觸發(fā)

設(shè)置了長緩存、但 Entity Tags 沒有移除時(shí)觸發(fā)

二者怎么選擇

毫無疑問選擇可以盡量多的命中緩存,然后靠更新靜態(tài)文件的版本號(hào)來使緩存失效。關(guān)于版本號(hào)建議使用 file.xxx.js 的形式而不是 file.js?v=xxx。

可以看這兩篇文章有講述原因:

Best Practices for Speeding Up Your Web Site

大公司里怎樣開發(fā)和部署前端代碼

(四)思考

在研究緩存問題的時(shí)候,知乎上看到這個(gè)問題:靜態(tài)資源(JS/CSS)存儲(chǔ)在localStorage有什么缺點(diǎn)?為什么沒有被廣泛應(yīng)用??,看了大神們的答案主要是維護(hù)成本實(shí)在過高,如果真的速度超快,這點(diǎn)可以忽略,值得花時(shí)間研究,但是如果讀取再執(zhí)行的速度可能會(huì)比瀏覽器直接304性能要低,就完全沒有必要使用這種方式了。

(五 )參考文章:

配置錯(cuò)誤產(chǎn)生的差距:200 OK (FROM CACHE) 與 304 NOT MODIFIED?

http://www.benhallbenhall.com/2012/03/http-codes-200-from-cache-304/

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/61846.html

相關(guān)文章

  • 性能優(yōu)化-http緩存

    摘要:整個(gè)請(qǐng)求響應(yīng)鏈的緩存機(jī)制必須遵循的特別指令?;镜木彺鏅C(jī)制就是由這些參數(shù)形成的。如果此文章中有什么問題的話,煩請(qǐng)一定要指出,謝謝參考資料緩存機(jī)制淺析移動(dòng)端加載性能優(yōu)化淺談瀏覽器的緩存機(jī)制 之前對(duì)http的緩存知識(shí)一知半解,只能說出個(gè)大概。和同事交流這塊內(nèi)容時(shí)稍一深入探討就捉襟見肘,自慚形穢。故痛定思痛,花了一兩天時(shí)間去研究了下這塊內(nèi)容,寫下這篇筆記方便以后的查詢與修正。 首先介紹下和緩...

    Aceyclee 評(píng)論0 收藏0
  • 漫談Web緩存

    摘要:了解前端緩存是打造高性能網(wǎng)站的必要知識(shí)。這個(gè)表示,你的請(qǐng)求發(fā)送到后端,后端判斷并認(rèn)為資源可以繼續(xù)使用,直接使用本地緩存。盡可能的設(shè)置久緩存時(shí)間,通過碼來管理版本。參考鏈接淺談緩存權(quán)威指南上配置緩存首發(fā)地址 背景說明 緩存一直是前端性能優(yōu)化中,濃墨重彩的一筆。了解前端緩存是打造高性能網(wǎng)站的必要知識(shí)。 之前,對(duì)于緩存的認(rèn)知一直停留在看《HTTP權(quán)威指南》和一些相關(guān)帖子的深度,過了一段時(shí)...

    davidac 評(píng)論0 收藏0
  • 漫談Web緩存

    摘要:了解前端緩存是打造高性能網(wǎng)站的必要知識(shí)。這個(gè)表示,你的請(qǐng)求發(fā)送到后端,后端判斷并認(rèn)為資源可以繼續(xù)使用,直接使用本地緩存。盡可能的設(shè)置久緩存時(shí)間,通過碼來管理版本。參考鏈接淺談緩存權(quán)威指南上配置緩存首發(fā)地址 背景說明 緩存一直是前端性能優(yōu)化中,濃墨重彩的一筆。了解前端緩存是打造高性能網(wǎng)站的必要知識(shí)。 之前,對(duì)于緩存的認(rèn)知一直停留在看《HTTP權(quán)威指南》和一些相關(guān)帖子的深度,過了一段時(shí)...

    Carl 評(píng)論0 收藏0
  • 漫談Web緩存

    摘要:了解前端緩存是打造高性能網(wǎng)站的必要知識(shí)。這個(gè)表示,你的請(qǐng)求發(fā)送到后端,后端判斷并認(rèn)為資源可以繼續(xù)使用,直接使用本地緩存。盡可能的設(shè)置久緩存時(shí)間,通過碼來管理版本。參考鏈接淺談緩存權(quán)威指南上配置緩存首發(fā)地址 背景說明 緩存一直是前端性能優(yōu)化中,濃墨重彩的一筆。了解前端緩存是打造高性能網(wǎng)站的必要知識(shí)。 之前,對(duì)于緩存的認(rèn)知一直停留在看《HTTP權(quán)威指南》和一些相關(guān)帖子的深度,過了一段時(shí)...

    shuibo 評(píng)論0 收藏0
  • 從前端角度理解緩存

    摘要:緩存的概念分很多種,本次討論的主要就是前端緩存中的緩存。從字面理解,強(qiáng)制緩存的方式簡單粗暴,給設(shè)置了過期時(shí)間,超過這個(gè)時(shí)間之后過期需要重新請(qǐng)求。這個(gè)方法簡單直接,直接設(shè)定一個(gè)絕對(duì)的時(shí)間當(dāng)前時(shí)間緩存時(shí)間。然后從緩存中讀取數(shù)據(jù)。 緩存的概念分很多種,本次討論的主要就是前端緩存中的Http緩存。 緩存是怎么回事 前端發(fā)送請(qǐng)求主要經(jīng)歷以下三個(gè)過程,請(qǐng)求->處理->響應(yīng)。如果有多次請(qǐng)求就需要重復(fù)...

    Astrian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<