HTTP緩存原理介紹

通過Internet獲取資源既緩慢,成本又高。為此,Http協(xié)議里包含了控制緩存的部分,以使Http客戶端可以緩存和重用以前獲取的資源,從而優(yōu)化性能,提升體驗。雖然Http中關(guān)于緩存控制的部分,隨著協(xié)議演進,有一些變化。但我覺著,作為后端程序員,在開發(fā)Web服務(wù)時,只需要關(guān)注請求頭If-None-Match、響應(yīng)頭ETag、響應(yīng)頭Cache-Control就足夠了。因為這三個Http頭就可以滿足你的需求,并且,當今絕大多數(shù)的瀏覽器,都支持這三個Http頭。我們所要做的就是,確保每個服務(wù)器響應(yīng)都提供正確的 HTTP 頭指令,以指導(dǎo)瀏覽器何時可以緩存響應(yīng)以及可以緩存多久。
緩存在哪兒?


HttpCache

上圖中有三個角色,瀏覽器、Web代理和服務(wù)器,如圖所示Http緩存存在于瀏覽器和Web代理中。當然在服務(wù)器內(nèi)部,也存在著各種緩存,但這已經(jīng)不是本文要討論的Http緩存了。所謂的Http緩存控制,就是一種約定,通過設(shè)置不同的響應(yīng)頭Cache-Control來控制瀏覽器和Web代理對緩存的使用策略,通過設(shè)置請求頭If-None-Match和響應(yīng)頭ETag,來對緩存的有效性進行驗證。
響應(yīng)頭ETag
ETag全稱Entity Tag,用來標識一個資源。在具體的實現(xiàn)中,ETag可以是資源的hash值,也可以是一個內(nèi)部維護的版本號。但不管怎樣,ETag應(yīng)該能反映出資源內(nèi)容的變化,這是Http緩存可以正常工作的基礎(chǔ)。


HttpCacheEtag

如上例中所展示的,服務(wù)器在返回響應(yīng)時,通常會在Http頭中包含一些關(guān)于響應(yīng)的元數(shù)據(jù)信息,其中,ETag就是其中一個,本例中返回了值為x1323ddx的ETag。當資源/file的內(nèi)容發(fā)生變化時,服務(wù)器應(yīng)當返回不同的ETag。
請求頭If-None-Match
對于同一個資源,比如上一例中的/file,在進行了一次請求之后,瀏覽器就已經(jīng)有了/file的一個版本的內(nèi)容,和這個版本的ETag,當下次用戶再需要這個資源,瀏覽器再次向服務(wù)器請求的時候,可以利用請求頭If-None-Match來告訴服務(wù)器自己已經(jīng)有個ETag為x1323ddx的/file,這樣,如果服務(wù)器上的/file沒有變化,也就是說服務(wù)器上的/file的ETag也是x1323ddx的話,服務(wù)器就不會再返回/file的內(nèi)容,而是返回一個304的響應(yīng),告訴瀏覽器該資源沒有變化,緩存有效。
HttpCache

如上例中所示,在使用了If-None-Match之后,服務(wù)器只需要很小的響應(yīng)就可以達到相同的結(jié)果,從而優(yōu)化了性能。
響應(yīng)頭Cache-Control
每個資源都可以通過Http頭Cache-Control來定義自己的緩存策略,Cache-Control控制誰在什么條件下可以緩存響應(yīng)以及可以緩存多久。 最快的請求是不必與服務(wù)器進行通信的請求:通過響應(yīng)的本地副本,我們可以避免所有的網(wǎng)絡(luò)延遲以及數(shù)據(jù)傳輸?shù)臄?shù)據(jù)成本。為此,HTTP 規(guī)范允許服務(wù)器返回一系列不同的 Cache-Control 指令,控制瀏覽器或者其他中繼緩存如何緩存某個響應(yīng)以及緩存多長時間。
Cache-Control 頭在 HTTP/1.1 規(guī)范中定義,取代了之前用來定義響應(yīng)緩存策略的頭(例如 Expires)。當前的所有瀏覽器都支持 Cache-Control,因此,使用它就夠了。

以下我來介紹可以再Cache-Control中設(shè)置的常用指令。
max-age
該指令指定從當前請求開始,允許獲取的響應(yīng)被重用的最長時間(單位為秒。例如:Cache-Control:max-age=60表示響應(yīng)可以再緩存和重用 60 秒。需要注意的是,在max-age指定的時間之內(nèi),瀏覽器不會向服務(wù)器發(fā)送任何請求,包括驗證緩存是否有效的請求,也就是說,如果在這段時間之內(nèi),服務(wù)器上的資源發(fā)生了變化,那么瀏覽器將不能得到通知,而使用老版本的資源。所以在設(shè)置緩存時間的長度時,需要慎重。
public和private
如果設(shè)置了public,表示該響應(yīng)可以再瀏覽器或者任何中繼的Web代理中緩存,public是默認值,即Cache-Control:max-age=60等同于Cache-Control:public, max-age=60。
在服務(wù)器設(shè)置了private比如Cache-Control:private, max-age=60的情況下,表示只有用戶的瀏覽器可以緩存private響應(yīng),不允許任何中繼Web代理對其進行緩存 - 例如,用戶瀏覽器可以緩存包含用戶私人信息的 HTML 網(wǎng)頁,但是 CDN 不能緩存。
no-cache
如果服務(wù)器在響應(yīng)中設(shè)置了no-cache即Cache-Control:no-cache,那么瀏覽器在使用緩存的資源之前,必須先與服務(wù)器確認返回的響應(yīng)是否被更改,如果資源未被更改,可以避免下載。這個驗證之前的響應(yīng)是否被修改,就是通過上面介紹的請求頭If-None-match和響應(yīng)頭ETag來實現(xiàn)的。
需要注意的是,no-cache這個名字有一點誤導(dǎo)。設(shè)置了no-cache之后,并不是說瀏覽器就不再緩存數(shù)據(jù),只是瀏覽器在使用緩存數(shù)據(jù)時,需要先確認一下數(shù)據(jù)是否還跟服務(wù)器保持一致。如果設(shè)置了no-cache,而ETag的實現(xiàn)沒有反應(yīng)出資源的變化,那就會導(dǎo)致瀏覽器的緩存數(shù)據(jù)一直得不到更新的情況。

no-store
如果服務(wù)器在響應(yīng)中設(shè)置了no-store即Cache-Control:no-store,那么瀏覽器和任何中繼的Web代理,都不會存儲這次相應(yīng)的數(shù)據(jù)。當下次請求該資源時,瀏覽器只能重新請求服務(wù)器,重新從服務(wù)器讀取資源。
怎樣決定一個資源的Cache-Control策略呢?
下面這個流程圖,可以幫到你。

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

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

  • 14020199014 李運澤 嵌牛導(dǎo)讀 我們都知道通過Internet獲取資源既緩慢,成本又高。為此,Http協(xié)...
    JasonLee_7641閱讀 238評論 0 1
  • 網(wǎng)絡(luò)特有的延遲以及數(shù)據(jù)傳輸?shù)某杀荆萍s互聯(lián)網(wǎng)快速獲取Web資源。為此,HTTP協(xié)議引入緩存以空間換時間,使瀏覽器緩...
    大頭8086閱讀 3,084評論 2 12
  • 本文內(nèi)容大多參考《圖解HTTP》一書 一. 認識代理服務(wù)器 所以講緩存為什么要先扯代理服務(wù)器?別急,讓我們看一下一...
    流光號船長閱讀 1,955評論 0 10
  • API定義規(guī)范 本規(guī)范設(shè)計基于如下使用場景: 請求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請求頻率非常高,建議使用雙通...
    有涯逐無涯閱讀 2,578評論 0 6
  • http協(xié)議有http0.9,http1.0,http1.1和http2三個版本,但是現(xiàn)在瀏覽器使用的是htt...
    一現(xiàn)_閱讀 1,884評論 0 3