分爲強緩存和協商緩存web
瀏覽器在加載資源的時候,會根據這個資源的http header判斷它是否命中強緩存,若是命中,就直接從緩存中讀取資源,不會發請求到服務器。瀏覽器
當強緩存沒有命中的時候,瀏覽器必定會發送一個請求到服務器,經過服務器端一句資源的另一些http header驗證這個資源是否命中協商緩存,若是協商緩存命中,服務器會將這個請求返回,告訴客戶端能夠直接從緩存中加載這個資源,因而瀏覽器就又會從本身的緩存中去加載這個資源。緩存
當協商緩存也沒有命中的時候,瀏覽器直接從服務器加載資源數據。服務器
強緩存是利用Expires或者Cache-Control這兩個http response header實現的,它們都用來表示客戶端緩存的有效期,請求響應返回的狀態爲200負載均衡
Expire:Thu, 31 Dec 2037 23:55:55 GMT分佈式
1)瀏覽器第一次跟服務器請求一個資源,服務器在返回這個資源的同時,在response的header加上Expires的header;ip
2)瀏覽器再請求這個資源時,先從緩存中尋找,找到這個資源後,拿出它的Expires跟當前的請求時間比較,若是請求時間在Expire指定的時間以前,就能命中緩存;資源
3)若是緩存沒有命中,瀏覽器直接從服務器加載資源時,Expire Header在從新加載的時候會被更新字符串
缺點
Exipires是較老的強緩存管理header,因爲它是服務器返回的一個絕對時間,在服務器時間與客戶端時間相差較大的時候,緩存管理容易出現問題,好比隨意修改一下客戶端時間就能影響緩存命中的結果。web服務器
Cache-Control: max-age = 315360000
1)瀏覽器第一次跟服務器請求一個資源,服務器在返回這個資源的同時,在response的header加上Cache-Control的header;
2)瀏覽器在接收到這個資源後,會把這個資源連同全部response header一塊兒緩存下來
3)瀏覽器再請求這個資源時,先從緩存中尋找,找到這個資源後,根據它第一次的請求時間和Cache-Control設定的有效期,計算出一個資源過時時間,再拿這個過時時間跟當前的請求時間比較,若是請求時間再過時時間以前,就能命中緩存;
4)若是緩存沒有命中,瀏覽器直接從服務器加載資源時,Cache-Control Header 在從新加載的時候會被更新。
前者描述的是絕對時間,後者是相對時間
能夠只啓用一個,也能夠同時啓用,同時存在時,Cache-Control優先級高於Expire
1)經過代碼方式,在web服務器返回的相應中添加Expires和Cache-Control Header;
2)經過配置web服務器的方式,讓web服務器在響應資源的時候統一添加Expires和Cache-Control Header
請求響應返回的狀態爲304而且會顯示一個Not Modified的字符串,協商緩存是利用的是Last-Modified,If-Modified-since和ETag,If-None-Match這兩對Header來管理的
Last-Modified: Tue, 12 Jan 2016 03:08:53 GMT
If-Modified-Since: Tue, 12 Jan 2016 03:08:53 GMT
1)瀏覽器第一次跟服務器請求一個資源,服務器在返回這個資源的同時,在respone的header加上Last-Modified的header,這個header表示這個資源在服務器上的最後修改時間;
2)瀏覽器再次跟服務器請求這個資源時,在request的header上加上If-Modified-Since的header,這個header的值就是上一次請求時返回的Last-Modified的值;
3)服務器再次收到資源請求時,根據瀏覽器傳過來If-Modified-Since和資源在服務器上的最後修改時間判斷資源是否有變化,若是沒有變化則返回304 Not Modified,可是不會返回資源內容;若是有變化,就正常返回資源內容。當服務器返回304 Not Modified的響應時,response header中不會再添加Last-Modified的header,由於既然資源沒有變化,那麼Last-Modified也就不會改變,這是服務器返回304時的response header;
4)瀏覽器收到304的響應後,就會從緩存中加載資源;
5)若是協商緩存沒有命中,瀏覽器直接從服務器加載資源時,Last-Modified Header在從新加載的時候會被更新,下次請求時,If-Modified-Since會啓用上次返回的Last-Modified值;
缺點:
有時候服務器上資源其實有變化,可是最後修改時間卻沒有變化,而這種問題又很不容易被定位出來,而當這種狀況出現的時候,就會影響協商緩存的可靠性
ETag: "17fd8-5291a5f96fd20"
1)瀏覽器第一次跟服務器請求一個資源,服務器在返回這個資源的同時,在respone的header加上ETag的header,這個header是服務器根據當前請求的資源生成的一個惟一標識,這個惟一標識是一個字符串,只要資源有變化這個串就不一樣,跟最後修改時間沒有關係,因此能很好的補充Last-Modified的問題;
2)瀏覽器再次跟服務器請求這個資源時,在request的header上加上If-None-Match的header,這個header的值就是上一次請求時返回的ETag的值;
3)服務器再次收到資源請求時,再根據資源生成一個新的ETag,與瀏覽器傳過來If-None-Match比較,若是這兩個值相同就說明資源沒有變化,不然就是有變化;若是沒有變化則返回304 Not Modified,可是不會返回資源內容;若是有變化,就正常返回資源內容。與Last-Modified不同的是,當服務器返回304 Not Modified的響應時,因爲ETag從新生成過,response header中還會把這個ETag返回,即便這個ETag跟以前的沒有變化
4)瀏覽器收到304的響應後,就會從緩存中加載資源。
注意的問題
分佈式系統裏多臺機器間文件的Last-Modified必須保持一致,以避免負載均衡到不一樣機器致使比對失敗;
分佈式系統儘可能關閉掉ETag(每臺機器生成的ETag都會不同);