技術分享:HTTP緩存機制
簡介
緩存是指將之前請求過的內容存儲在本地,之後可以重複利用而不用再次重新獲取相同的內容。
合理利用緩存是提高Web性能的一個重要方法,加快了客戶端渲染速度,同時減輕了伺服器的壓力。下面我們來介紹HTTP緩存的一些機制。
分類
HTTP緩存可以分成兩類:from cache 和 304緩存。
from cache:在並不會真的發出HTTP請求,而是直接從本地文件中讀取。
304緩存:304指的是HTTP響應碼,表示伺服器告訴客戶端該文件沒有修改過,可以直接用緩存的文件。相比from cache,304會發出HTTP請求,不過響應的內容並未包含請求的文件。
from cache
當我們打開開發者工具,有時我們可以看到下面這樣的請求:
當我們看到from xxx cache,我們就知道這些並沒有真正地發出請求,而是讀取的緩存。
那麼有哪些HTTP頭可以控制這類緩存呢?
Pragma
HTTP/1.0 舊時代的產物,當值為no-cache時禁用緩存。建議盡在需要支持HTTP/1.0緩存客戶端的情況下使用。
在請求頭和響應頭中都可以使用。
Cache-Control
HTTP/1.1,用於控制緩存的行為。主要有以下幾種值
no-cache: 不進行緩存,強制從伺服器進行拉取。可用在請求頭和響應頭中。
private/public: private表示不允許中間代理進行緩存,public則允許。只用於響應頭中。
max-age=: 緩存的有效時長,單位為秒。可用在請求頭和響應頭中。
Expires
HTTP/1.0,用戶控制緩存失效的時間,其值為HTTP時間戳。當Cache-Control設置了max-age
時,會忽略此響應頭。
304緩存
Last-Modified
HTTP/1.0 響應頭。其值為該資源最近的修改時間。之後客戶端再請求該資源時,會帶上Last-Modified-Since或者Last-Unmodified-Since請求頭,其值為之前響應頭的時間。如果資源在之後的時間內有修改,則伺服器會返回最新的資源,如果沒有修改,則只回304狀態碼,表示資源未過期,可以使用客戶端緩存。
ETag
HTTP/1.1 響應頭,其值為資源的HASH值。之後客戶端再請求該資源時,會帶上If-None-Match或者If-Match請求頭,其值為之前的HASH值。如果伺服器計算的HASH和客戶端發送的HASH不一致,則說明資源有修改,會返回完整的資源,如果一致,則返回304狀態碼。
與Last-Modified相比,ETag更能準確地檢測資源是否有過期,但是也需要更高的計算消耗。


TAG:千鋒JAVA開發學院 |