http 緩存那些事

簡介

http 的緩存都是從資源的第二次請求開始的,由於首次請求都是新的資源。瀏覽器

瀏覽器 http 緩存能夠分爲強緩存協商緩存緩存

強緩存和協商緩存的區別是:服務器

  • 命中強緩存,請求不會發送到服務器,此時 http 狀態碼爲200
  • 若是沒有命中強緩存,則發送請求到服務器,若命中協商緩存,則返回304狀態碼

下表所列緩存按照優先級進行排序:代理

字段名稱 字段分類
Pragma 請求頭&響應頭
Cache-Control 請求頭&響應頭
Expires 響應頭
If-None-Match / ETag 請求頭 / 響應頭
If-Modified-Since / Last-Modified 請求頭 / 響應頭

強緩存

強緩存在未失效的狀況下(即 Cache-Control 的值沒有過時或者 Expires 的緩存時間沒有過時),那麼就會直接使用瀏覽器的緩存數據,不會再向服務器發送任何請求。強制緩存生效時,http 狀態碼爲 200。對象

Pragma

Pragma 是一個在 HTTP/1.0 中規定的通用首部,它在響應頭的行爲沒有規範,依賴於瀏覽器的實現,建議只在須要兼容 HTTP/1.0 客戶端的場合下應用。參數只有一個:no-cache,會通知瀏覽器不直接使用強緩存,由於它優先級最高,當存在時必定不會命中強緩存。排序

Cache-Control

Cache-Control 也是 HTTP/1.1 控制瀏覽器緩存的主流字段,被用於在請求和響應中。請求頭和相應頭指令略有不一樣,這裏列舉幾個常見的指令:內存

  • max-age=<s>:設置緩存存儲的最大週期,超過這個時間緩存被認爲過時(單位秒)。
  • s-maxage=<s>:會覆蓋max-age或者Expires頭,可是僅適用於共享緩存
  • public:響應頭專有,代表響應能夠被任何對象(包括:發送請求的客戶端,代理服務器,等等)緩存
  • private:響應頭專有,代表響應只能被單個用戶緩存,不能做爲共享緩存(即代理服務器不能緩存它)
  • no-cache:不觸發強緩存,此時會觸發協商緩存
  • no-store:不使用緩存,此時也不會觸發協商緩存

Expires

Expires 是一個響應首部字段,它指定了一個日期/時間(值爲GMT時間,即格林尼治時間),在這個時間/日期以前,緩存被認爲是有效的。若是在 Cache-Control 響應頭設置了 "max-age" 或者 "s-max-age" 指令,那麼 Expires 頭會被忽略。資源

協商緩存

當 Cache-Control 和 Expires 過時或者 Cache-Control 的屬性設置爲 no-cache 時,那麼此時瀏覽器就會發送請求與服務器進行協商,服務器端對比判斷資源是否進行了修改更新。若是資源沒有修改,那麼就會返回 304 狀態碼,告訴瀏覽器可使用緩存中的數據,減小服務器的數據傳輸壓力。字符串

If-None-Match / ETag

ETag 是一個響應首部字段,它是根據實體內容生成的一段hash字符串,標識資源的狀態,由服務端產生。If-None-Match 是相應的請求頭字段。當與 If-Modified-Since 一同使用的時候,If-None-Match 優先級更高hash

If-Modified-Since / Last-Modified

Last-Modified 是一個響應首部字段,包含該資源上次修改的時間。 If-Modified-Since 是相應的請求頭字段。

協商緩存流程:

當瀏覽器第一次向服務器發送請求時,會在響應頭中返回協商緩存的屬性:ETag 和 Last-Modified,而後瀏覽器在第二次發送請求的時候,會在請求頭中帶上與 ETag 對應的 If-Not-Match,其值就是響應頭中返回的 ETag 的值,Last-Modified 對應的 If-Modified-Since。服務器在接收到這兩個參數後會作比較,若是返回的是304狀態碼,則說明請求的資源沒有修改,瀏覽器能夠直接在緩存中取數據,不然,服務器會直接返回數據。

from memory cache與from disk cache

當瀏覽器觸發強緩存時,咱們會看到資源會顯示 from memory cache 或者 from disk cache 的字樣,正常狀況下,當咱們這在訪問頁面時,資源會從內存中加載,即 from memory cache,若是咱們關閉瀏覽器,而後重新打開頁面,就會從磁盤加載該文件(前提是都觸發了強緩存),即 from disk cache,當咱們再次刷新是,資源又會被放到內存裏了。

相關文章
相關標籤/搜索