《HTTP權威指南》– 7.緩存

Web緩存的概念

Web緩存是能夠自動保存常見文檔副本的HTTP設備。html

使用緩存的優勢:

  1. 減小了數據的數據傳輸,節省了網絡費用;
  2. 緩解了網絡瓶頸的問題,不須要更多的帶寬就能更快地加載頁面;
  3. 下降了原始服務器的要求,服務器能夠更快地響應、避免過載出現;
  4. 下降了距離時延,由於比較遠的地方加載頁面會慢一些;

HTTP爲咱們提供了幾個用來對已緩存對象再驗證的工具,但最經常使用的是 IF-Modified-Since首部。將這個首部添加到 GET 請求中去,就能夠通知服務器:只有在緩存了對象的副本以後,又對其進行了修改的狀況下,才發送此對象。web

服務器對象未被修改: 服務器向客戶端發送一個小的 HTTP 304 Not Modified 響應;
服務器對象與已緩存對象不一樣: 服務器向客戶端發送一條普通的、帶有完整內容的 HTTP 200OK 響應;
服務器對象不存在: 服務器回送一個 404 Not Found 響應,緩存將其副本刪除;瀏覽器

HTTP沒有爲用戶提供一種手段來區分相應是緩存命中的仍是訪問原始服務器獲得的。在這兩種狀況下,響應碼都是 200 OK緩存

客戶端 有一種方法能夠判斷相應是否來自緩存,就是使用 Date首部。將響應中Date首部的值與當前時間進行比較,若是響應中的日期值比較早,客戶端一般就能夠認爲這是一條緩存的響應。服務器

緩存的拓撲結構:

緩存但是單個用戶專用的,也能夠是若干名用戶共享的。專用緩存被稱爲 私有緩存 (我的緩存,包含了單個用戶最經常使用的頁面),共享的緩存被成爲 公有緩存(包含了某個用戶團體的經常使用頁面)。網絡

緩存的處理步驟:

  1. 接收:緩存從網絡中讀取抵達的請求報文;
  2. 解析:緩存對報文進行解析,提取出URL和各類首部;
  3. 查詢:緩存查看是否有本地副本可用,若是沒有,就獲取一份副本(並將其保存在本地);
  4. 新鮮度檢測:緩存查看已緩存副本是否足夠新鮮,若是不是,就詢問服務器是否有更新;
  5. 建立響應:緩存會同新的首部和已緩存的主體來構建一條響應報文;
  6. 發送:緩存經過網絡將響應發回給客戶端;
  7. 日誌:緩存可選地建立一個日誌文件條目來描述這個事物;

文檔過時:

經過特殊的 HTTP Cache-Control 首部Expires 首部HTTP 讓原始服務器向每一個文檔附加了一個 過時時間。在緩存文檔過時以前,緩存可任意頻率使用這些副本,而無需與服務器聯繫,固然,除非客戶端請求中包含有阻止提供已緩存或未驗證資源的首部。工具

若是文檔過時了,並不意味着它和原始服務器上目前處於活躍狀態有實際的區別,僅僅意味着到了要進行覈對時間了,這種狀況被爲 服務器再驗證,說明緩存須要詢問原始服務器文檔是否發生了變化。若是文檔發生了變化,緩存會獲取一份新的文檔副本,並將其存儲在舊文檔的位置上,而後將文檔發送給客戶端。若是文檔沒有發生變化,緩存只須要獲取新的首部,包括一個新的過時日期,並對緩存中的首部進行更新便可。ui

HTTP協議緩存要求

HTTP協議要求行爲正確的緩存返回下列內容之一:代理

  1. 足夠新鮮的 已緩存副本;
  2. 與服務器進行過再驗證,確認其仍然新鮮的已緩存副本;
  3. 若是須要與之進行再驗證的原始服務器出現了故障,就返回一條錯誤報文;
  4. 附有警告信息說明內容可能不正確的已緩存對象;
實體標籤再驗證: If – None – Match

實體標籤 是附加到文檔上的任意標籤。它們可能包含了文檔的序列號或版本號,或者是文檔內容的校驗及其餘信息。當發佈者對文檔進行了修改時,能夠修改文檔的實體標籤來講明這個新的版本。這樣若是實體標籤被修改了,緩存就能夠用 If – None – Mach 條件首部來 GET 文檔的新副本了。實體標籤和修改日期都是 緩存驗證器日誌

控制緩存:

服務器能夠經過 HTTP 定義的幾種方式來指定在文檔過時以前能夠將其緩存多長時間,按照優先級順序:

能夠將如下首部信息附加到響應中:

1. Cache – Control :no-store
禁止緩存對響應進行復制。緩存一般會向非緩存代理服務器同樣,向客戶端轉發一條no-store響應,而後刪除對象

2.Cache – Control :no-cache
標識爲no-cache的響應其實是能夠存儲在本地緩存區中的,只是在原始服務器進行新鮮度再驗證以前,緩存不能將其提供給客戶端使用

3.Cache – Control :must-revalidate

4.Cache – Control :max-age 
表示從服務器將文檔傳來之時起,文檔的新鮮狀態剩餘秒數,服務器能夠將 Cache–Control:max-age 設置爲0,從而在每次訪問的時候都進行刷新

5.Cache – Control :Expires
不附加過時信息,讓緩存肯定本身的過時日期。

經過 HTTP-EQUIV 控制HTML緩存:

將HTML文檔設置爲非緩存的:

<META HTTP-EQUIV = "cache-control"  Content = "no -cache" >

<META HTTP-EQUIV > 標籤並非控制文檔緩存特性的好方法。由於支持 HTTP-EQUIV 標籤 的HTML瀏覽器使用的 Cache-Control 規則可能會與攔截代理緩存所使用的規則有所不一樣,這樣就會使緩存的過時處理行爲發生混亂。因此由通過正確配置的服務器發送
HTTP首部 來交流對文檔的緩存控制請求是惟一可靠的辦法。


圖靈圖書 -- HTTP權威指南

豆瓣讀書 -- HTTP權威指南

相關文章
相關標籤/搜索