緩存機制
網(wǎng)絡(luò)鏈路是影響數(shù)據(jù)傳輸最主要的因素,充分利用緩存從本地獲取數(shù)據(jù)可以極大提升性能。
簡單而言,瀏覽器請求一個資源,沒有緩存時發(fā)送請求。服務器返回資源,瀏覽器緩存并使用。后續(xù)再次請求該資源時即可直接使用緩存資源。
實際的緩存策略更加全面、復雜。
Cache-Control字段
瀏覽器和服務器都可用,用來協(xié)商緩存資源的細節(jié)。
除此之外,還有代理服務器場景也有獨特的機制和字段,暫不論及。
字段值
字段的值可用來標記資源的過期時間和緩存性等。
max-age:緩存資源的生存時間,從響應報文離開服務器開始計時。格式為:Cache-Control:max-age=30,表示緩存資源的生存時間為30s。
其他常見關(guān)鍵字
- no_store:表示禁止緩存。用于更新頻率較快的資源。
- no_cache:表示可以緩存,在使用前需向服務器驗證資源是否過期。
- must-revalidate:表示在緩存生存時間內(nèi),可直接使用資源,生存時間之后使用需向服務器驗證是否過期。用于更新頻率較慢的資源。
瀏覽器可在請求中包含標準的緩存請求指令與服務器協(xié)商,但最終返回資源的緩存細節(jié)由響應報文中緩存響應指令決定。
緩存驗證
常見的情景,瀏覽器已經(jīng)有緩存資源,在下次請求時,需向服務器驗證是否過期。
弱驗證
在時間粒度上的驗證,之前響應報文如果有l(wèi)ast-modify字段,可在后續(xù)請求時帶上if-modify-since,其值為last-modify的值,再由服務器判斷之前到目前資源是否更新。
無更新時,返回狀態(tài)304 not modify。有更新時,返回更新的資源。
強驗證
上述時間粒度上的驗證在更新頻率較高時有明顯缺點??蓪γ看胃碌馁Y源添加唯一標識。
響應報文中添加Etag(主體標簽)字段,請求報文中添加if-none-match,其值為Etag值。
可匹配到時,說明資源未過期;匹配不到時,返回更新的資源。