簡述瀏覽器緩存控制

瀏覽器緩存控制
瀏覽器緩存控制

如果讓我們去實現一個HTTP緩存機制,我們應該怎么去實現呢,接下來我們將帶著這個去閱讀這篇文章!

思路1,無緩存

假設瀏覽器向服務器請求資源a.html時,服務器找到對應的資源a.html,然后將資源返回給瀏覽器。當瀏覽器再次向服務器請求該資源時,服務器將再次將該資源返回給瀏覽器。
優點:簡單。。
缺點:每次請求資源都需要服務器查找,然后再返回資源,導致服務器相應慢,浪費帶寬。

思路2,有緩存無更新

我們通過思路1的思考,忽然大悟!哦,原來每次請求資源會導致這樣的問題啊,那么我們加個緩存不就好了嗎?哈哈,我真是太天才了。因此接下來,瀏覽器第一次請求資源a.html時,服務器會響應并發送完整文件,然后瀏覽器可以把這個文件存到本地(緩存),下次瀏覽器再次請求該資源時,就直接讀取本地緩存就可以,這應就能提高網頁響應速度和省下帶寬了。
優點:省帶寬,提高頁面響應速度。
缺點:果服務器上a.html的文件內容變了,瀏覽器每次都從緩存讀取無法獲取最新文件

思路3,緩存+更新機制

我們接下來思考!唔,思路二還是存在重大缺點,得去改進它。接下瀏覽器在請求a.html時服務器會發送完整的文件,并且服務器發送的文件還附帶額外的信息——過期時間,如** Expires: Mon,10 Dec 1990 02:25:22GMT**,瀏覽器可以把這個文件和額外信息存到本地。當瀏覽器再次想服務器請求a.html時,瀏覽器就會用當前的時間和Expires的時間作比較,如果還在Expires規定的時間內,則會使用本地緩存的a.html(200, from xx cache);否則再次向服務器再次請求a.html(200)。 服務器在每次給資源的時候都會發送新的過期時間。
優點:緩存可控制
缺點:控制的功能太單一,很有可能服務器a.htm更新了,客戶端還在用舊的資源。

思路4,緩存+更新機制升級版

上面我們已經實現了簡單的緩存的更新機制。但是還是覺得不太智能,功能太單一,我們思考一下,看一下應該如何完善。HTTP1.1版本提供了Cache-Control讓我們更好地去控制緩存。
比如:瀏覽器第一次請求a.html 時,服務器會發送完整的文件并附帶額外信息。

Cache-Control: max-age=300;

瀏覽器把文件和附帶信息保存起來。當再次需要a.html 時,如果是在300秒以內發起的請求則直接使用緩存(200, from xx cache),否則重新發起網絡請求(200)。(和Expires有點類似),下面是Cache-Control常見的幾個值:
<li>Public表示相應可以被任何中間節點緩存,如 Browser <-- proxy1 <-- proxy2 <-- Server,中間的代理可以緩存資源,比如下次再請求同一資源proxy1直接把自己緩存的東西給 Browser 而不再向proxy2要。</li>
<li>Private表示中間節點不能緩存,對于Browser <-- proxy1 <-- proxy2 <-- Server,proxy2 會老老實實把Server 返回的數據發送給proxy1,proxy1 會老老實實把Server 返回的數據發送給Browser ,自己不緩存任何數據。當下次Browser再次請求時proxy會做好請求轉發而不是自作主張給自己緩存的數據。</li>
<li>no-catch表示不使用 Cache-Control的緩存控制方式做前置驗證,而是使用 Etag 或者Last-Modified字段來控制緩存 </li>
<li>no-store ,真正的不緩存任何東西。瀏覽器會直接向服務器請求原始文件,并且請求中不附帶 Etag 參數(服務器認為是新請求)。</li>
<li>max-age,表示當前資源的有效時間,單位為秒。</li>
優點:緩存功能更為強大。
缺點:加入瀏覽器再次請求a.html,而緩存存在的時間間隔超過max-age設置的,這時候向服務器發送請求服務器應該會重新返回a.html的完整文件。假如,請求的a.html和原來的a.html一樣,沒有任何改變,則這就浪費了帶寬了。

思路5,緩存+更新機制終極版

鑒于思路4的實現方式還是有瑕疵,因此我們在思考一下。
比如:瀏覽器第一次請求a.html的時候,服務器響應發送完整的文件并附帶額外信息,其中Etag 是 對a.html文件的編碼,如果服務端的a.html沒有修改,則這個值就不會變。

Cache-Control: max-age=300;
ETag:W/"e-cbxLFQW5zapn79tQwb/g6Q"

瀏覽器把a.html和額外信息存放在本地,當緩存在max-age設置的時間間隔內,則直接讀取緩存a.html(200, from xx cache),假如瀏覽器在300秒之后再次需要獲取a.html時,瀏覽器發現該緩存的文件已經不新鮮了于是就向服務器發送請求 重新獲取a.html,在發送請求的時候附帶剛剛保存的a.html的ETag ( If-None-Match:W/"e-cbxLFQW5zapn79tQwb/g6Q"),服務器在接收到請求后拿瀏覽器請求的 Etag 和當前文件重新計算后端 Etag 做個比較,如果二者相等表示文件未修改則發送這個短消息(響應頭,不包含圖片內容, 304),如果二者不等則發送新文件和新的 ETag,瀏覽器獲取新文件并更新該文件的 Etag。

另外與Etag相似的是Last-Modified/If-Modified-Since。當資源過期時(max-age超時),發現資源具有Last-Modified聲明,則再次向web服務器請求時帶上頭 If-Modified-Since,表示請求時間。web服務器收到請求后發現有頭If-Modified-Since 則與被請求資源的最后修改時間進行比對。若最后修改時間較新,說明資源又被改動過,則響應整片資源內容(200),若最后修改時間較舊,說明資源無新修改,則響應HTTP 304 ,告知瀏覽器繼續使用所保存的cache。

總結

經過帶著問題,不斷提出新的思路,我們最終實現控制緩存的比較好的方式。其實HTTP對于前端是非常重要,尤其當我們學習了Node.js或者其他后端語言去寫web服務端的時候,我們發現離不開HTTP,因此我們應該要注重HTTP的知識,而不只是比較這個框架好,還是那個框架牛。況且框架的使用視業務場景而定。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容