HTTP 緩存的關鍵路徑

1、證件照場景

拍一次證件照麻煩且費錢,所以每次拍的時候咱們都會多留幾張備用。這就是計算機世界的緩存,在現實世界中的寫照。數據庫

若是某個行爲很消耗資源,很麻煩,那在實現它的時候就順便多保留幾份,這種行爲就是緩存。特色很明顯瀏覽器

  • 容量有限,咱們不可能留一屋子的備用照片緩存

  • 有時效性,小時候的證件照長大了不能用吧服務器

2、HTTP 緩存

緩存是一個比較籠統的概念,幾乎任何行爲均可以將結果緩存起來,尤爲那些模塊與模塊的鏈接處,例如計算機世界的數據庫查詢,網絡I/O等等,而人類世界諸如找人事部開收入證實、去婚姻登記處開未婚證實等等基本上會多開兩三份。網絡

本文討論的是 HTTP 協議層面的緩存,它規範了瀏覽器和服務器在發送和接收到 HTTP 報文時,應該怎麼解析和處理其中的緩存邏輯。其關鍵路徑以下圖所示spa

圖 1 HTTP 緩存關鍵路徑
clipboard.png3d

3、關鍵路徑之驗證緩存

瀏覽器發起一個請求,生成 HTTP 報文,先發送到緩存器,緩存器驗證是否有本地緩存,緩存是否過時等,即圖 1 的第一條路徑,稱之爲驗證緩存。blog

這個過程有三種結果:ip

  • 不存在緩存資源

  • 存在緩存,且緩存未過時(由 Cache-control 或 Epire 決定)

  • 存在緩存,但緩存已過時

若是存在緩存,且緩存未過時,則使用緩存響應客戶請求,而不會向服務器發送請求。其它兩種狀況,都會將 HTTP 報文發送給服務器,那麼服務器將怎麼處理?

4、關鍵路徑之服務器再驗證

HTTP 報文通過緩存器進行驗證後,除了使用本地緩存的狀況,其餘都會向服務器發請求,服務器處理邏輯以下

  • 本地不存在緩存狀況,報文將直接被髮送給服務器,服務器響應請求,而且在響應的報文中帶上資源的緩存控制信息

  • 若是本地存在緩存,但緩存已過時,那麼緩存器將在請求報文中帶上 if-None-Match(取值對應ETag) 和 if-Modified-Since (取值對應 Last-Modified),服務器分別對這兩個字段進行校驗。有更新則返回新的資源文件、新緩存控制信息;沒有更新則返回 30四、以及新的緩存控制信息,瀏覽器更新緩存,並響應本地緩存文件。

服務器響應的緩存控制信息,包含Cache-Control 和 Expire,以及 ETag 和 Last-Modified,如圖2

圖2 服務器正常響應包含的緩存控制信息
clipboard.png

5、小結

完整的關鍵路徑,存在如下可能

圖3 緩存關鍵路徑的幾種狀況
clipboard.png

  • 瀏覽器第一次訪問某文件,本地無緩存,服務器響應文件資源,幷包含 Cache-Control 和 Expire,瀏覽器緩存器據此緩存資源。報文還會包含 ETag 和 Last-Modified

  • 瀏覽器再次請求該文件,若是有緩存,由緩存信息中的 Cache-Control 和 Expire 決定緩存是否過時,沒過時則直接使用緩存;過時則利用ETag 和 Last-Modified 詢問服務器是否修改過該文件,服務器驗證後,發現文件修改過則響應新的文件和緩存控制信息,緩存器更新緩存並響應新文件;若未修改過則返回304和緩存控制信息,緩存器更新緩存控制信息,並響應本地緩存文件給瀏覽器

6、問題

完整的關鍵鏈路已經說完!比較理想的狀況下,有ETag、Last-Modified,有Cache-Control、Expire,但實現又不老是完美的,關於緩存還有如下問題須要弄清楚

  1. 服務器沒有響應 Cache-Control、Expire 會出現什麼狀況?這種狀況下,ETag 和 Last-Modified 還有用嗎?

  2. ETag 和 Last-Modified 功能有些相似,它們的做用有何區分?Expire 和 Cache-Control max-age 存在一樣的問題。

  3. ETag 是什麼?Last-Modified 又是什麼?

  4. 怎麼設置這些頭部信息?

  5. 瀏覽器點擊刷新按鈕,點擊從新加載會出現什麼狀況?客戶端向服務器發送Cache-Control 會出現什麼狀況Cache-Control 的取值有不少,各自的意義是什麼?

相關文章
相關標籤/搜索