數據庫緩存、服務器端緩存(代理服務器緩存、CDN 緩存)、瀏覽器緩存css
HTTP 緩存、indexDB、cookie、localstorage 等等html
Expiresnode
Cache-Control算法
由多個字段組合而成數據庫
瀏覽器第一次請求數據以後會將數據和響應頭部的緩存標識存儲起來。再次請求時會帶上存儲的頭部字段,服務器端驗證是否可用。若是返回 304 Not Modified,表明資源沒有發生改變可使用緩存的數據,獲取新的過時時間。反之返回 200 就至關於從新請求了一遍資源並替換舊資源瀏覽器
Last-modified(響應頭)/If-Modified-Since(請求頭)緩存
Etag/If-None-Match:服務器
last-modified 和 Etag 區別cookie
一、在URI輸入欄中輸入而後回車工具
200 OK (from cache)
,瀏覽器發現該資源已經緩存了並且沒有過時(經過Expires頭部或者Cache-Control頭部),沒有跟服務器確認,而是直接使用了瀏覽器緩存的內容。其中響應內容和以前的響應內容如出一轍
二、F5/點擊工具欄中的刷新按鈕/右鍵菜單從新加載
不管如何都發一個HTTP Request給Server,即便先前的響應中有Expires頭部
Cache-Control: max-age=0 // Chrome強制加上的 If-Modified-Since: Fri, 15 Jul 2016 04:11:51 GMT
三、Ctl+F5
完全的從Server拿一份新的資源過來
還須要添加一些HTTP Headers。按照HTTP/1.1協議,Cache不光只是存在Browser終端,從Browser到Server之間的中間節點(好比Proxy)也可能扮演Cache的做用
在Chrome 51 中會包含兩個頭部信息, 做用就是讓中間的Cache對這個請求失效,這樣返回的絕對是新鮮的資源。
Cache-Control: no-cache Pragma: no-cache Cache-Control: no-cache
etag
,那麼資源下次請求時就會把值加入到請求頭 if-none-match
中last-modified
,那麼資源下次請求時就會把值加入到請求頭 if-modified-since
中補充:協商緩存在node的實現