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

資訊專欄INFORMATION COLUMN

瀏覽器緩存,想說愛你不容易

Imfan / 2358人閱讀

摘要:瀏覽器緩存的分類瀏覽器緩存主要有兩類緩存協(xié)商和徹底緩存,也有稱之為協(xié)商緩存和強緩存。只能被終端用戶的瀏覽器緩存,不允許等中繼緩存服務(wù)器對其緩存。

今天小微開店寶在測試環(huán)境發(fā)布更新的時候,同事問:“為什么我需要手動清理瀏覽器緩存才能看到變更?難道系統(tǒng)上線后也需要客戶自己清理瀏覽器緩存嗎!”看來,這個坑需要我來填了。

什么是瀏覽器緩存

瀏覽器緩存(Brower Caching)是瀏覽器在本地磁盤對用戶最近請求過的文檔進行存儲,當(dāng)訪問者再次訪問同一頁面時,瀏覽器就可以直接從本地磁盤加載文檔。

瀏覽器緩存的優(yōu)點有:

減少了冗余的數(shù)據(jù)傳輸,節(jié)省了網(wǎng)費

減少了服務(wù)器的負擔(dān),大大提升了網(wǎng)站的性能

加快了客戶端加載網(wǎng)頁的速度

在前端開發(fā)面試中,瀏覽器緩存是web性能優(yōu)化面試題中很重要的一個知識點,從而說明瀏覽器緩存是提升web性能的一大利器,但是瀏覽器緩存如果使用不當(dāng),也會產(chǎn)生很多問題,正所謂是,想說愛你,并不是很容易的事。所以,結(jié)合最近遇到的案例,本文對瀏覽器緩存相關(guān)的知識進行總結(jié)歸納,希望對讀者有所幫助。

瀏覽器緩存的分類

瀏覽器緩存主要有兩類:緩存協(xié)商徹底緩存,也有稱之為協(xié)商緩存強緩存。

瀏覽器在第一次請求發(fā)生后,再次請求時:

瀏覽器會先獲取該資源緩存的header信息,根據(jù)其中的expirescahe-control判斷是否命中強緩存,若命中則直接從緩存中獲取資源,包括緩存的header信息,本次請求不會與服務(wù)器進行通信;

如果沒有命中強緩存,瀏覽器會發(fā)送請求到服務(wù)器,該請求會攜帶第一次請求返回的有關(guān)緩存的header字段信息(Last-Modified/IF-Modified-Since、Etag/IF-None-Match),由服務(wù)器根據(jù)請求中的相關(guān)header信息來對比結(jié)果是否命中協(xié)商緩存,若命中,則服務(wù)器返回新的響應(yīng)header信息更新緩存中的對應(yīng)header信息,但是并不返回資源內(nèi)容,它會告知瀏覽器可以直接從緩存獲?。环駝t返回最新的資源內(nèi)容

強緩存

強緩存是利用http的返回頭中的Expires或者Cache-Control兩個字段來控制的,用來表示資源的緩存時間。

Expires
該字段是http1.0時的規(guī)范,它的值為一個絕對時間的GMT格式的時間字符串,比如Expires:Mon,18 Oct 2066 23:59:59 GMT。這個時間代表著這個資源的失效時間,在此時間之前,即命中緩存。這種方式有一個明顯的缺點,由于失效時間是一個絕對時間,所以當(dāng)服務(wù)器與客戶端時間偏差較大時,就會導(dǎo)致緩存混亂。

Cache-Control
Cache-Control是http1.1時出現(xiàn)的header信息,主要是利用該字段的max-age值來進行判斷,它是一個相對時間,例如Cache-Control:max-age=3600,代表著資源的有效期是3600秒。cache-control除了該字段外,還有下面幾個比較常用的設(shè)置值:

no-cache:不使用本地緩存。需要使用緩存協(xié)商,先與服務(wù)器確認返回的響應(yīng)是否被更改,如果之前的響應(yīng)中存在ETag,那么請求的時候會與服務(wù)端驗證,如果資源未被更改,則可以避免重新下載。

no-store:直接禁止游覽器緩存數(shù)據(jù),每次用戶請求該資源,都會向服務(wù)器發(fā)送一個請求,每次都會下載完整的資源。

public:可以被所有的用戶緩存,包括終端用戶和CDN等中間代理服務(wù)器。

private:只能被終端用戶的瀏覽器緩存,不允許CDN等中繼緩存服務(wù)器對其緩存。

Cache-Control與Expires可以在服務(wù)端配置同時啟用,同時啟用的時候Cache-Control優(yōu)先級高。

協(xié)商緩存

協(xié)商緩存就是由服務(wù)器來確定緩存資源是否可用,所以客戶端與服務(wù)器端要通過某種標(biāo)識來進行通信,從而讓服務(wù)器判斷請求資源是否可以緩存訪問,這主要涉及到下面兩組header字段,這兩組搭檔都是成對出現(xiàn)的,即第一次請求的響應(yīng)頭帶上某個字段(Last-Modified或者Etag),則后續(xù)請求則會帶上對應(yīng)的請求字段(If-Modified-Since或者If-None-Match),若響應(yīng)頭沒有Last-Modified或者Etag字段,則請求頭也不會有對應(yīng)的字段。

Last-Modify/If-Modify-Since

瀏覽器第一次請求一個資源的時候,服務(wù)器返回的header中會加上Last-Modify,Last-modify是一個時間標(biāo)識該資源的最后修改時間,例如Last-Modify: Thu,31 Dec 2037 23:59:59 GMT。

當(dāng)瀏覽器再次請求該資源時,request的請求頭中會包含If-Modify-Since,該值為緩存之前返回的Last-Modify。服務(wù)器收到If-Modify-Since后,根據(jù)資源的最后修改時間判斷是否命中緩存。

如果命中緩存,則返回304,并且不會返回資源內(nèi)容,并且不會返回Last-Modify。

ETag/If-None-Match

與Last-Modify/If-Modify-Since不同的是,Etag/If-None-Match返回的是一個校驗碼。ETag可以保證每一個資源是唯一的,資源變化都會導(dǎo)致ETag變化。服務(wù)器根據(jù)瀏覽器上送的If-None-Match值來判斷是否命中緩存。

與Last-Modified不一樣的是,當(dāng)服務(wù)器返回304 Not Modified的響應(yīng)時,由于ETag重新生成過,response header中還會把這個ETag返回,即使這個ETag跟之前的沒有變化。

為什么要有Etag

你可能會覺得使用Last-Modified已經(jīng)足以讓瀏覽器知道本地的緩存副本是否足夠新,為什么還需要Etag呢?HTTP1.1中Etag的出現(xiàn)主要是為了解決幾個Last-Modified比較難解決的問題:

一些文件也許會周期性的更改,但是他的內(nèi)容并不改變(僅僅改變的修改時間),這個時候我們并不希望客戶端認為這個文件被修改了,而重新GET;

某些文件修改非常頻繁,比如在秒以下的時間內(nèi)進行修改,(比方說1s內(nèi)修改了N次),If-Modified-Since能檢查到的粒度是s級的,這種修改無法判斷(或者說UNIX記錄MTIME只能精確到秒);

某些服務(wù)器不能精確的得到文件的最后修改時間。

Last-Modified與ETag是可以一起使用的,服務(wù)器會優(yōu)先驗證ETag,一致的情況下,才會繼續(xù)比對Last-Modified,最后才決定是否返回304。

強緩存與協(xié)商緩存的區(qū)別可以用下表來表示:

緩存類型 獲取資源形式 狀態(tài)碼 發(fā)送請求到服務(wù)器
強緩存 從緩存取 200(from cache) 否,直接從緩存取
協(xié)商緩存 從緩存取 304(Not Modified) 否,通過服務(wù)器來告知緩存是否可用
用戶行為對緩存的影響
用戶操作 Expires/Cache-Control Last-Modied/Etag
地址欄回車 有效 有效
頁面鏈接跳轉(zhuǎn) 有效 有效
新開窗口 有效 有效
前進回退 有效 有效
F5刷新 無效 有效
Ctrl+F5強制刷新 無效 無效
實際問題分析

如文章開頭所屬,代碼更新到線上后用戶瀏覽器不能自行更新,我們不能要求客戶在系統(tǒng)更新后都進行一次緩存清理的操作。

到底該如何解決呢?

在資源請求的URL中增加一個參數(shù),比如:js/mian.js?ver=0.7.1。這個參數(shù)是一個版本號,每一次部署的時候變更一下,當(dāng)這個參數(shù)變化的時候,強緩存都會失效并重新加載。這樣一來,靜態(tài)資源,部署以后就需要重新加載。這樣就比較完美的解決了問題。

進一步思考

這樣做是不是最完美的呢?很遺憾,不是。

至于有什么更好的建議,希望大家在留言區(qū)進行討論。

謝謝!

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

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

相關(guān)文章

  • this - 想說愛你容易

    摘要:構(gòu)造函數(shù)也是函數(shù),所以當(dāng)你用普通調(diào)用方式調(diào)用時這個時候相當(dāng)于給對象添加了和兩個屬性。為構(gòu)造函數(shù)指定這里報錯了,原因是我們?nèi)チ撕瘮?shù),這里的函數(shù)不是一個構(gòu)造函數(shù)當(dāng)然解決方式也是有的。 前言 javascript中的this是啥東西?為啥我們經(jīng)常被他搞得暈頭轉(zhuǎn)向不知所以?他是惡魔?是天使 ?是怪胎?讓我們一起來揭開它那神秘的面紗。 showImg(https://segmentfault.c...

    zhaot 評論0 收藏0
  • 網(wǎng)絡(luò)協(xié)議 14 - 流媒體協(xié)議:要說愛你容易

    摘要:而我們喜歡的這些直播,他們用到的傳輸協(xié)議有一個通用名流媒體傳輸協(xié)議。要認識流媒體協(xié)議,就離不開下面的三大系列名詞。 【前五篇】系列文章傳送門: 網(wǎng)絡(luò)協(xié)議 9 - TCP協(xié)議(下):聰明反被聰明誤 網(wǎng)絡(luò)協(xié)議 10 - Socket 編程(上):實踐是檢驗真理的唯一標(biāo)準 網(wǎng)絡(luò)協(xié)議 11 - Socket 編程(下):眼見為實耳聽為虛 網(wǎng)絡(luò)協(xié)議 12 - HTTP 協(xié)議:常用而不簡單 網(wǎng)絡(luò)...

    yankeys 評論0 收藏0
  • 網(wǎng)絡(luò)協(xié)議 14 - 流媒體協(xié)議:要說愛你容易

    摘要:而我們喜歡的這些直播,他們用到的傳輸協(xié)議有一個通用名流媒體傳輸協(xié)議。要認識流媒體協(xié)議,就離不開下面的三大系列名詞。 【前五篇】系列文章傳送門: 網(wǎng)絡(luò)協(xié)議 9 - TCP協(xié)議(下):聰明反被聰明誤 網(wǎng)絡(luò)協(xié)議 10 - Socket 編程(上):實踐是檢驗真理的唯一標(biāo)準 網(wǎng)絡(luò)協(xié)議 11 - Socket 編程(下):眼見為實耳聽為虛 網(wǎng)絡(luò)協(xié)議 12 - HTTP 協(xié)議:常用而不簡單 網(wǎng)絡(luò)...

    phodal 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<