由於最近面試常常會被問到304緩存的問題,所以在網上搜集了各類資料,小記一下面試
緩存有瀏覽器緩存,代理服務器緩存,服務端緩存等,這裏着重記一下瀏覽器緩存segmentfault
瀏覽器第一次像服務器發起請求時,若是有緩存,瀏覽器在返回信息裏面會帶上相應的緩存策略,下面介紹一下有哪些經常使用的緩存策略。瀏覽器
Expires 過時時間,這是HTTP1.0就有的。客戶端在首次請求服務器資源的時候服務器設置一個資源的過時時間,這個時間是絕對的,若是設置的緩存策略是這個,那麼瀏覽器再次請求的時候會跟所請求資源的過時時間比對一下,若是在過時時間以內,那麼從本地讀取,不然會看看是否設置了其餘緩存策略,按照其餘策略來,沒有的話就向服務器發起請求了。咱們能夠看出,這個是否發起請求跟客戶端本地時間有很大關係,若是時間設置的不對,那麼緩存策略就有可能失效。緩存
Cache-control 這一項的可選值有 max-age/no-cache/no-store/public/private/must-revalidate/s-maxage
這裏面最經常使用到的有max-age/no-cache/no-store, max-age服務器
max-age 會設置一個相對的過時秒數,即從首次請求算起,在這一段時間內都不會過時。
no-cache 響應是能夠被緩存的,只不過再跟服務器進行新鮮度匹配以前都不會提供給客戶端使用。因此應該叫do-not-serve-from-cache-without-revalidation更好一點。
no-store 絕對禁止緩存,客戶端緩存不能複製響應,以後的每次請求都從服務器獲取資源。
must-revalidate 在跟服務器進行新鮮度驗證以前,緩存不能夠把緩存的響應給瀏覽器。若是原始服務器不可用,會返回504 Gateway Timeout的錯誤。
only-if-cached 告知瀏覽器,我但願內容來自緩存,我並不關心被緩存響應,是不是新鮮的。spa
Last-modified
在瀏覽器第一次請求某一個資源時,服務器端的返回狀態會是200,內容是你請求的資源,同時有一個Last-Modified的屬性標記此文件在服務期端最後被修改的時間。.net
客戶端請求驗證緩存的有效性。代理
If-modified-sinceblog
客戶端再次請求某個資源時請求頭會帶上這個屬性。驗證在上次修改的時間以後是否有再次修改。資源
If-none-match
客戶端再次請求某個資源時請求頭會帶上這個屬性。屬性值是第一次請求該資源時返回的etag值
驗證在上次修改以後是否有新的版本。
緩存命中速度
緩存命中 > 緩存再驗證成功 > 緩存未命中 = 緩存再驗證失敗;
緩存命中優先級
Cache-Control http1.1 > Expires > Pragma http1.0來決定是否 (200 from cache)
根據Last-Modified http1.0 和 ETag http1.1 來驗證是否返回 (304 Not Modified) 二者都有,就必須同時驗證,而且二者都知足纔會返回304;
盜圖一張,整個的瀏覽器請求的時候緩存驗證過程以下圖
首先看有沒有緩存,沒有的話直接請求服務器,這時候沒出意外的話,正常地返回應該是200
有緩存而後看是否過時,沒過時的話就用緩存的資源了這時候不會發器請求
若是過時了再向服務器發起請求看資源是否有修改,若是沒修改則返回304,若是修改了則返回200連同最新的資源一塊兒返回,更新瀏覽器緩存副本。
參考文章
https://segmentfault.com/a/11...
https://segmentfault.com/a/11...
https://segmentfault.com/a/11...
https://my.oschina.net/leejun...
http://blog.csdn.net/pojianbi...
https://segmentfault.com/a/11...