【HTTP緩存】理論知識(shí)

時(shí)間:2016-12-12 17:51:30
作者: zhongxia

零、前言

這里主要寫的是理論,具體實(shí)踐的比較少,后期寫一個(gè)實(shí)踐教程励稳,內(nèi)容基本都是從參考文章里面抄過來的【看完文章,順便寫做下筆記局蚀,加深理解麦锯。】

瀏覽器緩存琅绅,也就是客戶端緩存,既是網(wǎng)頁性能優(yōu)化里面靜態(tài)資源相關(guān)優(yōu)化的一大利器鹅巍,也是無數(shù)web開發(fā)人員在工作過程不可避免的一大問題千扶,所以在產(chǎn)品開發(fā)的時(shí)候我們總是想辦法避免緩存產(chǎn)生,而在產(chǎn)品發(fā)布之時(shí)又在想策略管理緩存提升網(wǎng)頁的訪問速度骆捧。

了解瀏覽器的緩存命中原理澎羞,是開發(fā)web應(yīng)用的基礎(chǔ),本文著眼于此敛苇,學(xué)習(xí)瀏覽器緩存的相關(guān)知識(shí)妆绞,總結(jié)緩存避免和緩存管理的方法顺呕,結(jié)合具體的場(chǎng)景說明緩存的相關(guān)問題。希望能對(duì)有需要的人有所幫助括饶。

一株茶、瀏覽器緩存基本認(rèn)識(shí)

1. 強(qiáng)緩存 和 協(xié)商緩存

瀏覽器在加載資源的時(shí),先根據(jù) http header 判斷它是否命中強(qiáng)緩存.

  • 命中強(qiáng)緩存:瀏覽器直接從自己緩存中讀取資源图焰,不發(fā)送請(qǐng)求到服務(wù)器

  • 不命中強(qiáng)緩存:瀏覽器發(fā)送一個(gè)請(qǐng)求到服務(wù)器启盛,服務(wù)器根據(jù)資源的另外一些 http header 驗(yàn)證 該資源 是否命中 協(xié)商緩存

    • 命中協(xié)商緩存:將請(qǐng)求返回,但不是返回該資源的數(shù)據(jù)技羔,而是告訴瀏覽器可以直接從緩存中加載這個(gè)資源僵闯。

    • 不命中協(xié)商緩存:服務(wù)器返回該資源數(shù)據(jù)

2. 異同點(diǎn) 和 關(guān)系

共同點(diǎn):命中,都是從瀏覽器緩存中加載資源
不同點(diǎn):強(qiáng)緩存不發(fā)送請(qǐng)求到服務(wù)器藤滥,協(xié)商緩存會(huì)發(fā)送請(qǐng)求鳖粟。

必須開啟強(qiáng)緩存,協(xié)商緩存才會(huì)起作用

二拙绊、強(qiáng)緩存原理

什么是協(xié)商緩存牺弹?
如圖,返回http狀態(tài)為200时呀,size為 form cache 的就是強(qiáng)緩存


1. HTTP Response Header 看強(qiáng)緩存

Expires

HTTP1.0 時(shí)代张漂,Expires 【表示資源過期時(shí)間】【緩存過期的下一個(gè)時(shí)間 必須GMT 格式】

可能存在問題:服務(wù)器時(shí)間和客戶端時(shí)間不一致,因此 HTTP1.1 出了一些 Cache-control

如圖:


Cache-control

HTTP1.1 時(shí)代谨娜,Cache-control: 過期時(shí)間【緩存多少毫秒】
如圖:


例子:

Expires步驟

  1. 瀏覽器第一次請(qǐng)求資源航攒,服務(wù)器在返回的同時(shí),會(huì)在 response 的 header 上加上 Expires

  2. 瀏覽器收到資源后趴梢,把資源和 Expires 一起緩存下來

  3. 第二次請(qǐng)求資源時(shí)漠畜,拿出Expires和當(dāng)前請(qǐng)求時(shí)間比較下,如果還未過期坞靶,則直接從緩存中讀取出來憔狞,【這個(gè)就叫命中緩存

  4. 沒有命中的話,去服務(wù)端請(qǐng)求彰阴,走協(xié)商緩存道路瘾敢,最后返回時(shí),會(huì)返回一個(gè)新的 Expires 尿这, 瀏覽器在緩存下來簇抵。

Cache-control 步驟

和 Expires一樣,只是 過期時(shí)間=當(dāng)前時(shí)間+Cache-control 的 Max-age 緩存毫秒數(shù)

Cache-control 和 Expires

  1. 這兩個(gè)可以一起用射众,也可以只用其中一個(gè) 【一起用碟摆,優(yōu)先級(jí): Cache-Control > Expires
  2. Expires 是比較老的強(qiáng)緩存管理Header,因?yàn)樗墙^對(duì)時(shí)間叨橱,而服務(wù)器時(shí)間和客戶端時(shí)間相差大典蜕,或者修改客戶端時(shí)間断盛,就會(huì)影響緩存命中率
  3. Cache-control 是相對(duì)時(shí)間,受到的影響小一些

如何設(shè)置強(qiáng)緩存?

1. 代碼形式

通過代碼的形式愉舔,在web服務(wù)器的返回響應(yīng) header 中添加 Expies钢猛, Cache-control

java.util.Date date = new java.util.Date();    
response.setDateHeader("Expires",date.getTime()+20000); //Expires:過時(shí)期限值 
response.setHeader("Cache-Control", "public"); //Cache-Control來控制頁面的緩存與否,public:瀏覽器和緩存服務(wù)器都可以緩存頁面信息;
response.setHeader("Pragma", "Pragma"); //Pragma:設(shè)置頁面是否緩存屑宠,為Pragma則緩存厢洞,no-cache則不緩存

設(shè)置不緩存

response.setHeader( "Pragma", "no-cache" );   
response.setDateHeader("Expires", 0);   
response.addHeader( "Cache-Control", "no-cache" );//瀏覽器和緩存服務(wù)器都不應(yīng)該緩存頁面信息

2. web服務(wù)器配置

讓web服務(wù)器在響應(yīng)資源的時(shí)候統(tǒng)一添加Expires和Cache-Control Header

nginx和apache作為專業(yè)的web服務(wù)器,都有專門的配置文件典奉,可以配置expires和cache-control躺翻,這方面的知識(shí),如果你對(duì)運(yùn)維感興趣的話卫玖,可以在百度上搜索“nginx 設(shè)置 expires cache-control”或“apache 設(shè)置 expires cache-control”都能找到不少相關(guān)的文章公你。

3. 強(qiáng)緩存的應(yīng)用

  1. 強(qiáng)緩存是前端性能優(yōu)化最有力的工具,沒有之一假瞬。

  2. 大量的靜態(tài)資源網(wǎng)站陕靠,一定要利用強(qiáng)緩存,提高響應(yīng)速度

  3. 例子脱茉,京東頁面剪芥,強(qiáng)緩存到2026年∏傩恚【這個(gè)強(qiáng)緩存可以有】

  4. 使用強(qiáng)緩存后税肪,如何更新網(wǎng)站呢?

給文件加上 hash 值榜田。

知乎上的完美解決方案
https://www.zhihu.com/question/20790576

  1. 注意點(diǎn)【強(qiáng)緩存針對(duì)靜態(tài)資源益兄,動(dòng)態(tài)資源不要,html資源不要箭券【煌保】

強(qiáng)緩存還有一點(diǎn)需要注意的是,通常都是針對(duì)靜態(tài)資源使用辩块,動(dòng)態(tài)資源需要慎用蛔六,除了服務(wù)端頁面可以看作動(dòng)態(tài)資源外,那些引用靜態(tài)資源的html也可以看作是動(dòng)態(tài)資源庆捺,如果這種html也被緩存古今,當(dāng)這些html更新之后,可能就沒有機(jī)制能夠通知瀏覽器這些html有更新滔以,尤其是前后端分離的應(yīng)用里,頁面都是純html頁面氓拼,每個(gè)訪問地址可能都是直接訪問html頁面你画,這些頁面通常不加強(qiáng)緩存抵碟,以保證瀏覽器訪問這些頁面時(shí)始終請(qǐng)求服務(wù)器最新的資源

三、協(xié)商緩存

1. 什么是協(xié)商緩存坏匪?

如圖:返回http狀態(tài)304拟逮,Not Modified


說白了就是瀏覽器自己不確定,沒有辦法決定适滓,因此要找 服務(wù)器商量下敦迄。 服務(wù)器說可以,那瀏覽器就直接從自己緩存里面找出資源凭迹, 服務(wù)器說你這個(gè)不行啊罚屋,過期了。 我給你個(gè)新的嗅绸,瀏覽器就拿新的咯脾猛。

協(xié)商緩存要發(fā)請(qǐng)求,所有header都是 response 和 request 一人一個(gè)鱼鸠。

2. 協(xié)商緩存如何控制猛拴?

協(xié)商緩存是利用的是【Last-Modified,If-Modified-Since】和【ETag蚀狰、If-None-Match】這兩對(duì)Header來管理的愉昆。

Response Header : Last-Modified, ETag
Request Header : If-Modified-Since , If-None-Match

3. 【Last-Modified,If-Modified-Since】緩存管理方式

  1. 第一次跟web服務(wù)器請(qǐng)求資源時(shí)麻蹋,在 response 的 header 加上 Last-Modified【文件最后修改時(shí)間】

  2. 瀏覽器收到資源的時(shí)候跛溉,把資源文件和 Last-Modified 緩存起來

  3. 再次請(qǐng)求的時(shí)候, 在 Request Header 加上 If-Modified-Since 的 header哥蔚, 這個(gè)值倒谷,就是 第一次web服務(wù)器返回的 Last-Modified。

  4. web服務(wù)器收到之后糙箍,判斷 Last-Modified-Since 和 Last-Modified 是否一致渤愁,一致則返回 304 Not Modified. 讓瀏覽器去加載緩存里面的。

  5. 不一致的話深夯,返回資源抖格,并返回一個(gè)新的 Last-Modified

  6. 瀏覽器繼續(xù)緩存下來, 然后繼續(xù)上面的步驟咕晋。

【Last-Modified雹拄,If-Modified-Since】都是根據(jù)服務(wù)器時(shí)間返回的header,一般來說掌呜,在沒有調(diào)整服務(wù)器時(shí)間和篡改客戶端緩存的情況下滓玖,這兩個(gè)header配合起來管理協(xié)商緩存是非常可靠的质蕉,但是有時(shí)候也會(huì)服務(wù)器上資源其實(shí)有變化势篡,但是最后修改時(shí)間卻沒有變化的情況翩肌,而這種問題又很不容易被定位出來,而當(dāng)這種情況出現(xiàn)的時(shí)候禁悠,就會(huì)影響協(xié)商緩存的可靠性念祭。所以就有了另外一對(duì)header來管理協(xié)商緩存,這對(duì)header就是【ETag碍侦、If-None-Match】粱坤。

4.【ETag、If-None-Match】的緩存管理的方式是

所有的步驟都是差不多的

  1. 發(fā)送請(qǐng)求瓷产,返回資源的時(shí)候站玄,也返回了一個(gè) ETag【文件的Hash值】

  2. 瀏覽器緩存資源,并緩存下 ETag

  3. 再次請(qǐng)求的時(shí)候拦英,Request Header If-None-Match 把上次傳過來的 ETag 傳過去

  4. web服務(wù)器蜒什,在生成一個(gè)資源文件的 ETag, 然后跟傳過來的比較

  5. 一樣疤估,返回 304 Not-Modified,瀏覽器從緩存拿

  6. 不一樣灾常, web服務(wù)器返回資源,并返回一個(gè)新的 ETag铃拇, 然后重復(fù)上面操作钞瀑。

強(qiáng)緩存 和 協(xié)商緩存的 緩存管理都是一樣的步驟哈。

5. 注意ETag的使用

  1. 在分布式部署的時(shí)候慷荔,多臺(tái)機(jī)器的 Last-Modified 必須保持一致雕什,否則協(xié)商緩存會(huì)出問題。

  2. 分布式部署显晶,不同的機(jī)器生成的 ETag 都會(huì)不一樣贷岸。 然后協(xié)商緩存就會(huì)出問題×坠停【因此如果沒有搞定ETag 一致偿警,就先關(guān)閉掉∥希】

  3. 協(xié)商緩存 需要 配合 強(qiáng)緩存使用 【不啟動(dòng)強(qiáng)緩存螟蒸,協(xié)商緩存也就不起作用】
    response header 包含了強(qiáng)緩存的管理 header

四、瀏覽器行為對(duì)緩存的影響

如果資源已經(jīng)被瀏覽器緩存下來崩掘,在緩存失效之前七嫌,再次請(qǐng)求時(shí),默認(rèn)會(huì)先檢查是否命中強(qiáng)緩存苞慢,如果強(qiáng)緩存命中則直接讀取緩存诵原,如果強(qiáng)緩存沒有命中則發(fā)請(qǐng)求到服務(wù)器檢查是否命中協(xié)商緩存,如果協(xié)商緩存命中,則告訴瀏覽器還是可以從緩存讀取皮假,否則才從服務(wù)器返回最新的資源鞋拟。這是默認(rèn)的處理方式骂维,這個(gè)方式可能被瀏覽器的行為改變:

  1. 當(dāng)ctrl+f5強(qiáng)制刷新網(wǎng)頁時(shí)惹资,直接從服務(wù)器加載,跳過強(qiáng)緩存和協(xié)商緩存航闺;
  2. 當(dāng)f5刷新網(wǎng)頁時(shí)褪测,跳過強(qiáng)緩存,但是會(huì)檢查協(xié)商緩存潦刃;

五侮措、注意點(diǎn)

勾選這個(gè) disable cache 緩存, 則不會(huì)使用緩存


參考文章

  1. 《瀏覽器緩存知識(shí)小結(jié)及應(yīng)用》
  2. 《HTTP緩存》
  3. 《瀏覽器 HTTP 協(xié)議緩存機(jī)制詳解》
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乖杠,一起剝皮案震驚了整個(gè)濱河市分扎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胧洒,老刑警劉巖畏吓,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卫漫,居然都是意外死亡菲饼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門列赎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宏悦,“玉大人,你說我怎么就攤上這事包吝”罚” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵诗越,是天一觀的道長(zhǎng)砖瞧。 經(jīng)常有香客問我,道長(zhǎng)掺喻,這世上最難降的妖魔是什么芭届? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮感耙,結(jié)果婚禮上褂乍,老公的妹妹穿的比我還像新娘。我一直安慰自己即硼,他們只是感情好逃片,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般褥实。 火紅的嫁衣襯著肌膚如雪呀狼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天损离,我揣著相機(jī)與錄音哥艇,去河邊找鬼。 笑死僻澎,一個(gè)胖子當(dāng)著我的面吹牛貌踏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窟勃,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼祖乳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了秉氧?” 一聲冷哼從身側(cè)響起眷昆,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汁咏,沒想到半個(gè)月后亚斋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梆暖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年伞访,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轰驳。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厚掷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出级解,到底是詐尸還是另有隱情冒黑,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布勤哗,位于F島的核電站抡爹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏芒划。R本人自食惡果不足惜冬竟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望民逼。 院中可真熱鬧泵殴,春花似錦、人聲如沸拼苍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吆你,卻和暖如春弦叶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妇多。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工伤哺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砌梆。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓默责,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親咸包。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容