瀏覽器緩存主要有兩類
緩存協(xié)商:Last-midified ,Etag
徹底緩存:cache-control,Expires
緩存協(xié)商的意思是需要去服務(wù)器端詢問(wèn)頁(yè)面有沒有修改過(guò),沒有修改過(guò)則返回304直接使用緩存內(nèi)容,否則返回新內(nèi)容
協(xié)商步驟:
- 服務(wù)器發(fā)送帶Last-midified:GMTtime 頭的http response
- 瀏覽器下次請(qǐng)求時(shí)帶上if-modified-since:GMTtime http 請(qǐng)求頭
- 服務(wù)端用本地Last-midified時(shí)間與if-modified-since比較,計(jì)算瀏覽器數(shù)據(jù)是否過(guò)期并發(fā)送響應(yīng)
Etag的工作原理與Last-midified類似,不同點(diǎn)在于Etag的值是用戶可自定義的
緩存協(xié)商可應(yīng)用在動(dòng)態(tài)頁(yè)面且實(shí)時(shí)性不是特別強(qiáng)的頁(yè)面,如網(wǎng)站首頁(yè) 徹底緩存 徹底緩存的意思是在緩存失效之前不再需要跟服務(wù)器交互
常用的是Expires,Expires的值是一個(gè)絕對(duì)時(shí)間,由服務(wù)器產(chǎn)生
這兒存在一個(gè)問(wèn)題,就是服務(wù)器的時(shí)間可能給客戶端的時(shí)間不一致導(dǎo)致緩存時(shí)間的偏差
要解決這個(gè)問(wèn)題就要使用cache-control,它保存的是一個(gè)相對(duì)瀏覽器的時(shí)間
如果同時(shí)存在cache-control和Expires怎么辦呢?
瀏覽器總是優(yōu)先使用cache-control,如果沒有cache-control才考慮Expires
瀏覽器緩存最大的價(jià)值是節(jié)省了帶寬 為什么沒有提高吞吐率呢? 下面來(lái)分析一下
這里分兩種情況:靜態(tài)頁(yè)面和動(dòng)態(tài)頁(yè)面 服務(wù)端加載靜態(tài)頁(yè)面需要進(jìn)行磁盤IO,瀏覽器緩存則可節(jié)省這部分時(shí)間,不過(guò)服務(wù)器一般會(huì)用squid等工具進(jìn)行緩存,所以
靜態(tài)資源在提高吞吐率方面效果不明顯 再來(lái)看一看動(dòng)態(tài)資源
動(dòng)態(tài)資源也分為兩類:實(shí)時(shí)動(dòng)態(tài)和準(zhǔn)實(shí)時(shí)動(dòng)態(tài)
實(shí)時(shí)動(dòng)態(tài)是不能用瀏覽器緩存的
準(zhǔn)實(shí)時(shí)動(dòng)態(tài)頁(yè)面可節(jié)省磁盤IO和計(jì)算時(shí)間,但是讓瀏覽器緩存的時(shí)間不可太久,且在本地重復(fù)訪問(wèn)的概率也不大
所以說(shuō)
動(dòng)態(tài)內(nèi)容在提高吞吐率方面效果也不明顯 對(duì)于準(zhǔn)實(shí)時(shí)動(dòng)態(tài)頁(yè)面倒是可以緩存在服務(wù)端,如squid