1.強緩存:不會向服務器發送請求,直接從緩存中讀取資源,在chrome控制檯的network選項中能夠看到該請求返回200的狀態碼,而且size顯示from disk cache或from memory cache;算法
2.協商緩存:向服務器發送請求,服務器會根據這個請求的request header的一些參數來判斷是否命中協商緩存,若是命中,則返回304狀態碼並帶上新的response header通知瀏覽器從緩存中讀取資源;chrome
注意:二者的共同點是,都是從客戶端緩存中讀取資源;區別是強緩存不會發請求,協商緩存會發請求。瀏覽器
Expires:response header裏的過時時間,瀏覽器再次加載資源時,若是在這個過時時間內,則命中強緩存。
Cache-Control:當值設爲max-age=300時,則表明在這個請求正確返回時間(瀏覽器也會記錄下來)的5分鐘內再次加載資源,就會命中強緩存。緩存
以百度爲案例:
服務器
注意:Expires和Cache-Control的區別還有一個:Expires是一個具體的服務器時間,這就致使一個問題,若是客戶端時間和服務器時間相差較大,緩存命中與否就不是開發者所指望的。Cache-Control是一個時間段,控制就比較容易。負載均衡
ETag和If-None-Match:這兩個要一塊兒說。Etag是上一次加載資源時,服務器返回的response header,是對該資源的一種惟一標識,只要資源有變化,Etag就會從新生成。瀏覽器在下一次加載資源向服務器發送請求時,會將上一次返回的Etag值放到request header裏的If-None-Match裏,服務器接受到If-None-Match的值後,會拿來跟該資源文件的Etag值作比較,若是相同,則表示資源文件沒有發生改變,命中協商緩存。性能
ETag和Last-Modified的做用和用法也是差很少,說一說他們的區別。
首先在精確度上,Etag要優於Last-Modified。Last-Modified的時間單位是秒,若是某個文件在1秒內改變了屢次,那麼他們的Last-Modified其實並無體現出來修改,可是Etag每次都會改變確保了精度;若是是負載均衡的服務器,各個服務器生成的Last-Modified也有可能不一致。
第二在性能上,Etag要遜於Last-Modified,畢竟Last-Modified只須要記錄時間,而Etag須要服務器經過算法來計算出一個hash值。
第三在優先級上,服務器校驗優先考慮Etag。cdn
一樣以京東爲案例blog