1、概念基礎
參考原文:https://blog.csdn.net/hiredme/article/details/73468040
http的緩存,主要存在於本地瀏覽器和web代理服務器中。 在這裏,咱們講的是瀏覽器緩存。css
1. 響應頭ETag(Entity Tag)html
Etag用來表示一個資源。在服務器返回響應時包含這個值,不一樣的資源response返回不同的Etag。在下次請求相同的資源時,瀏覽器會在 if-None-Match中帶着Etag的傳給服務器,若是服務器發現Etag和上次相同,直接返回304資源未發生改變,瀏覽器使用緩存數據。只要資源有變化,Etag就會從新生成。web
請求頭if-None-Match。if-None-Match表示客戶端存取的是該資源的校驗值,也就是Etag算法
Etag是上一次加載資源時,服務器返回的response header,是對該資源的一種惟一標識,只要資源有變化,Etag就會從新生成。瀏覽器在下一次加載資源向服務器發送請求時,會將上一次返回的Etag值放到request header裏的If-None-Match裏,服務器只須要比較客戶端傳來的If-None-Match跟本身服務器上該資源的ETag是否一致,就能很好地判斷資源相對客戶端而言是否被修改過了。若是服務器發現ETag匹配不上,那麼直接以常規GET 200回包形式將新的資源(固然也包括了新的ETag)發給客戶端;若是ETag是一致的,則直接返回304知會客戶端直接使用本地緩存便可。
Etag和Last-Modified二者之間對比:
首先在精確度上,Etag要優於Last-Modified。Last-Modified的時間單位是秒,若是某個文件在1秒內改變了屢次,那麼他們的Last-Modified其實並無體現出來修改,可是Etag每次都會改變確保了精度;若是是負載均衡的服務器,各個服務器生成的Last-Modified也有可能不一致。
第二在性能上,Etag要遜於Last-Modified,畢竟Last-Modified只須要記錄時間,而Etag須要服務器經過算法來計算出一個hash值。
第三在優先級上,服務器校驗優先考慮Etag
2.響應頭Cache-Controlchrome
Cache_-Control主要用來控制緩存相關的東西。Cache-Control頭在http 1.1中定義,取代了http1.0版本中用來定義響應緩存策略的頭例如(Expires)瀏覽器
緩存指令主要包括:緩存
1.public private public用來聲明瀏覽器和web代理服務器均可以緩存. private表示僅容許瀏覽器緩存,代理服務器不容許緩存服務器
2.no-cache no-cache不是指不緩存,而是指每次請求資源以前都先向服務器驗證該資源是否發生改變負載均衡
3.no-store 表示不緩存,即瀏覽器和代理服務器都不緩存。性能
4.max-age 表示緩存的內容在XXX秒後失效。
5.must-revalidate 使得客戶端再次瀏覽當前頁面時必須法送http頭信息到服務器進行驗證,而後才決定是否加載客戶端本地cache
if-modified-since和last-modified的比較
瀏覽器在第一次訪問資源時,服務器返回資源的同時,在response header中添加 Last-Modified的header,值是這個資源在服務器上的最後修改時間,瀏覽器接收後緩存文件和header;
Last-Modified: Fri, 22 Jul 2016 01:47:00 GMT
瀏覽器下一次請求這個資源,瀏覽器檢測到有 Last-Modified這個header,因而添加If-Modified-Since這個header,值就是Last-Modified中的值;服務器再次收到這個資源請求,會根據 If-Modified-Since 中的值與服務器中這個資源的最後修改時間對比,若是沒有變化,返回304和空的響應體,直接從緩存讀取,若是If-Modified-Since的時間小於服務器中這個資源的最後修改時間,說明文件有更新,因而返回新的資源文件和200。
2、緩存生效的過程
參考原文:https://www.cnblogs.com/mamimi/p/6900987.html
服務器收到請求時,會在200OK中返回該資源的Last-Modified和ETag頭,客戶端將該資源保存在cache中,並記錄這兩個屬性。當客戶端須要發送相同的請求時,會在請求中攜帶If-Modified-Since和If-None-Match兩個頭。兩個頭的值分別是響應中Last-Modified和ETag頭的值。服務器經過這兩個頭判斷本地資源未發生變化,客戶端不須要從新下載,返回304響應。常見流程以下圖所示:
3、http的緩存機制
參考於:https://www.jianshu.com/p/54cc04190252
我的對緩存數據失效的理解:我的認爲緩存數據失效並非緩存數據在內存或者磁盤中消失,只是不提供訪問,可是它仍是真實存在與內存或者磁盤中。
強制緩存失效:其實就是時間超過Expires或者Cache-Control中的max-age,致使緩存數據失效。
協商緩存失效:其實就是文件發生改變,Etag發生改變。
強制緩存和協商緩存
強制緩存:不會向服務器發送請求,直接從瀏覽器緩存中讀取資源。在chrome的控制檯的network選項中,能夠看到該請求返回200的狀態碼,而且size顯示from disk cache或者 from memory cache。
from memory cache表明使用內存中的緩存,from disk cache則表明使用的是硬盤中的緩存,瀏覽器讀取緩存的順序爲memory –> disk。在瀏覽器中,瀏覽器會在js和圖片等文件解析執行後直接存入內存緩存中,那麼當刷新頁面時只需直接從內存緩存中讀取(from memory cache);而css文件則會存入硬盤文件中,因此每次渲染頁面都須要從硬盤讀取緩存(from disk cache)。
緩存機制工做流程
在客戶端第一次請求數據時,此時瀏覽器緩存中沒有對應的緩存數據,須要請求服務器,服務器返回數據後,將數據存儲至瀏覽器緩存。
第二次請求數據時存在兩種狀況:
1.緩存數據失效。
2.緩存數據失效。
緩存標識:我的理解爲Etag的值。
協商緩存就是在強制緩存失效後(也就是緩存數據失效後),瀏覽器帶着緩存標識向服務器發起請求有服務器根據緩存標識決定是否使用緩存的過程。主要有如下兩種狀況:
1.協商緩存生效,返回304和Not Modified。
2.協商緩存失效,返回200和請求結果
緩存機制的總結
強制緩存優先於協商緩存進行,若強制緩存(Expires和Cache-Control)生效則直接使用緩存,若不生效則進行協商緩存(Last-Modified / If-Modified-Since和Etag / If-None-Match),協商緩存由服務器決定是否使用緩存,若協商緩存失效,那麼表明該請求的緩存失效,返回200,從新返回資源和緩存標識,再存入瀏覽器緩存中;生效則返回304,繼續使用緩存。