HTTP緩存機制

1.概覽

Web 緩存大體能夠分爲:數據庫緩存、服務器端緩存(代理服務器緩存、CDN 緩存)、瀏覽器緩存。數據庫

瀏覽器緩存也包含不少內容: HTTP 緩存、indexDB、cookie、localstorage 等等。這裏咱們只討論 HTTP 緩存相關內容。瀏覽器

瀏覽器緩存主要是 HTTP 協議定義的緩存機制。緩存

2.緩存過時機制
  • 緩存命中率:從緩存中獲得數據的請求數與全部請求數的比率。理想狀態是越高越好。
  • 過時內容:超過設置的有效時間,被標記爲「陳舊」的內容。一般過時內容不能用於回覆客戶端的請求,必須從新向源服務器請求新的內容或者驗證緩存的內容是否仍然準備。
  • 驗證:驗證緩存中的過時內容是否仍然有效,驗證經過的話刷新過時時間。
  • 失效:失效就是把內容從緩存中移除。當內容發生改變時就必須移除失效的內容。

加載頁面流程:

  1. 瀏覽器先根據這個資源的http頭信息來判斷是否命中強緩存。若是命中則直接加在緩存中的資源,並不會將請求發送到服務器,返回碼200。
  2. 若是未命中強緩存,則瀏覽器會將資源加載請求發送到服務器。服務器來判斷瀏覽器本地緩存是否失效。若可使用,則服務器並不會返回資源信息,瀏覽器繼續從緩存加載資源,服務器返回304重定向到瀏覽器緩存。
  3. 若是未命中協商緩存,則服務器會將完整的資源返回給瀏覽器,瀏覽器加載新資源,並更新緩存,返回200。

首次請求:

 

瀏覽器再次請求時:

 

強緩存能夠認爲沒有過時的緩存,協調緩存指已過時但未被服務器修改的內容。服務器

 3.強緩存

 命中強緩存時,瀏覽器並不會將請求發送給服務器。在Chrome的開發者工具中看到http的返回碼是200,可是在Size列會顯示爲(from cache)。
cookie

強緩存是利用http的返回頭中的Expires或者Cache-Control兩個字段來控制的,用來表示資源的緩存時間。 ide

3.1  Expires 絕對時間

緩存過時時間,用來指定資源到期的時間,是服務器端的具體的時間點。工具

Expires是Web服務器響應消息頭字段,表明資源的失效時間,是絕對是時間。.net

 

 

 因爲失效時間是一個絕對時間,因此當客戶端本地時間被修改之後,服務器與客戶端時間誤差變大之後,就會致使緩存混亂。因此出現了3.2 Cache-Control3d

3.2 Cache-Control選項指定相對時間

https://blog.csdn.net/u012375924/article/details/82806617,講的不錯。localstorage

請求中Cache-Control可選項:

 

 

 在響應中使用Cache-Control 時,它可選的值有:

Cache-Control是一個相對時間,例如Cache-Control:3600,表明着資源的有效期是3600秒。

Cache-Control比Expires優先級高。

4.協商緩存

若未命中強緩存,則瀏覽器會將請求發送至服務器。服務器根據http頭信息中的Last-Modify/If-Modify-Since或Etag/If-None-Match來判斷是否命中協商緩存。若是命中,則http返回碼爲304,瀏覽器從緩存中加載資源。

4.1 Last-Modify/If-Modify-Since

瀏覽器第一次請求一個資源的時候,服務器返回的header中會加上Last-Modify,Last-modify是一個時間標識該資源的最後修改時間:

 

 

 當瀏覽器再次請求該資源時,發送的請求頭中會包含If-Modify-Since,該值爲緩存以前返回的Last-Modify。服務器收到If-Modify-Since後,根據資源的最後修改時間判斷是否命中緩存。

 

 

 若是命中緩存,則返回http304,而且不會返回資源內容,而且不會返回Last-Modify。因爲對比的服務端時間,因此客戶端與服務端時間差距不會致使問題。

既然有這個爲何還有4.2 ETag呢?

1. Last-Modified標註的最後修改只能精確到秒級,若是某些文件在1秒鐘之內,被修改屢次的話,它將不能準確標註文件的修改時間;

2. 若是某些文件會被按期生成,修改時間變了,但內容沒變,但Last-Modified卻改變了,致使文件無法使用緩存;

3.有可能存在服務器沒有準確獲取文件修改時間,或者與代理服務器時間不一致等情形。

4.2 ETag/If-None-Match

Etag/If-None-Match返回的是一個校驗碼(ETag: entity tag)。ETag能夠保證每個資源是惟一的,資源變化都會致使ETag變化*。ETag值的變動則說明資源狀態已經被修改。服務器根據瀏覽器上發送的If-None-Match值來判斷是否命中緩存。

 

 5.總結

https://blog.csdn.net/u012375924/article/details/82806617

  1. 緩存開關是: pragma, cache-control。
  2. 緩存校驗有:Expires,Last-Modified,etag。

從狀態碼的角度來看,它們的關係以下圖:

 

 總結:304就是在過時的但沒有失效的狀況下,協助緩存的結果。

相關文章
相關標籤/搜索