天天看點

HTTP協定的緩存機制(Client端)

HTTP協定的緩存機制(Client端)

正在進行的項目正好涉及到了HTTP協定緩存的相關内容,在看了各種相關資料後,有了自己的了解。是以分享出來,一個是為了友善大家交流,也是能夠加強自身記憶。畢竟,費曼學習法告訴我們,把學過的東西在講個别人才是真正學懂了。

http協定緩存主要可以分為server side(服務端)和client side(用戶端)緩存兩種

  1. server side又可以分為三類:代理伺服器緩存、方向代理伺服器緩存(nginx反向代理緩存)和cdn;
  2. client side可以分為兩類:HTTP協定緩存HTML标簽緩存

    其中html标簽緩存是在html的meta标簽中寫入該頁面的緩存需求。但是這種方式支援的浏覽器較少,并不是主流的用戶端緩存機制。

今天我們主要來研究一下用戶端的 HTTP協定緩存。首先,先看一下浏覽器發起一個請求的過程:

HTTP協定的緩存機制(Client端)

我們可以看到,在請求之前,浏覽器會先判斷本地緩存中是否有改請求的緩存,對于第一次請求,沒有緩存,則向web伺服器發送請求。同時,在接收到浏覽器響應後,會對響應進行分析,按照響應政策,來進行緩存。

那麼在浏覽器進行第二次的請求之前會發生什麼呢?别急,再此之前我們先介紹一下浏覽器的緩存政策,友善對下面的了解。浏覽器緩存政策分為如下:

HTTP協定的緩存機制(Client端)
  1. 緩存存儲政策

    緩存存儲政策主要用來規定緩存的一些特征。包括是否可以被緩存,以及可以被那些浏覽器緩存,緩存時間等

  2. 緩存過期政策

    緩存過期政策主要用來表征緩存能夠存儲的時間。如果在正常時間内,緩存都是有效的

  3. 緩存對比政策

    用戶端将本地緩存與伺服器中内容進行對比,確定本地緩存是有效的。這一點可以了解為,用戶端并不是有了緩存就不向伺服器請求了,而是會想用戶端發送驗證請求,當驗證本地緩存無效了才會重新發送請求

下面我們繼續看一下用戶端的第二次請求

HTTP協定的緩存機制(Client端)

在第二次請求之前,還是會檢測是否有緩存。如果檢測到有緩存,會判斷該緩存的有效性。先通過過期政策判斷。如果沒有指定其他的,而隻有expiresTime,并且該事件沒有過期,那麼就證明緩存有效,不用去擷取。如果expiresTime過期或者沒有。則會進行對比政策。對比政策先進行E-tag對比。E-tag是服務端給資源自動生成的唯一辨別符,對于檔案更新之後,就會重新生成。伺服器進行對比,如果發現不一樣的話,就會重新發送資源,并請求頭為200.如果一樣,證明緩存有效,那麼就發送304相應,讓用戶端從本地讀取緩存。如果沒有E-tag那麼就使用last-modified政策。該政策會向伺服器發送請求,然後伺服器會對比改政策發來的修改時間同請求資源修改時間是否一緻,如果不一樣,本地緩存就廢棄。

雖然緩存政策分為三部分,但是其三部分是有相關聯的。可以看下下面的圖檔

HTTP協定的緩存機制(Client端)

緩存存儲政策主要通過Cache-Control來設定。其有一下幾個參數:

  • max-age

    執行緩存被認為是最新的最長時間。類似于過期時間,這個參數是基于請求時間的相對時間間隔,而不是絕對過期時間,[秒]是一個數字,機關是秒:從請求時間開始到過期時間之間的秒數。

  • s-maxage

    類似于max-age屬性,除了他應用于共享(如:代理伺服器)緩存

  • public

    标記認證内容也可以被緩存,一般來說: 經過HTTP認證才能通路的内容,輸出是自動不可以緩存的;

  • no-cache

    強制每次請求直接發送給源伺服器,而不經過本地緩存版本的校驗。這對于需要确認認證應用很有用(可以和public結合使用),或者嚴格要求使用最新資料的應用(不惜犧牲使用緩存的所有好處);

  • no-store

    強制緩存在任何情況下都不要保留任何副本

  • must-revalidate

    告訴緩存必須遵循所有你給予副本的新鮮度的,HTTP允許緩存在某些特定情況下傳回過期資料,指定了這個屬性,你高速緩存,你希望嚴格的遵循你的規則。

  • proxy-revalidate

    和 must-revalidate類似,除了他隻對緩存代理伺服器起作用

從上圖也可以發現。cache-control不知規定了緩存的存儲政策,其實也變相的規定了他的過期政策和對比政策。

要注意的是,如果cache-control的值被設定為no-cache并不是說不緩存了。而是說把他的緩存的max-age設定為0.也就是在每一次請求的時候,都認為該緩存是過期的,需要重新從伺服器驗證緩存的合法性。

最後,看一下請求頭和響應頭的對應關系

  • .Last-Modified/If-Modified-Since

    前者是響應頭傳回的資源最後修改時間,後者是請求頭在請求改資源時候帶着的資源資訊。用來讓伺服器判斷是否該資源是最新的

  • ETag/If-None-Match

    前者是響應頭傳回的資源在伺服器中的唯一辨別符,後者是用來在客服端再次請求該資源時候攜帶,讓伺服器來判斷該資源是否和伺服器上對應資源一緻

繼續閱讀