1,緩存的作用
緩存可以優化性能,應該是最簡單的一種方式了,可以減少一些不必要的請求,或者在數據一致的情況下,不再將數據回傳回來。
2,緩存位置
緩存位置有四種,各自有優先級,當四種都沒有命中時,才會去請求網絡
- service worke : 我們可以來手動控制緩存哪些文件,如何匹配和讀取緩存。不管service worker命中緩存與否。該請求瀏覽器上都顯示的from service worker。
- memory cache: 內存中的緩存,讀取速度比磁盤中的緩存快很多,但是持續時間短,會隨着進程的釋放而釋放。
- disk cache: 硬盤中的緩存,讀取速度慢,但容量大,存儲時間很長。會根據header中的字段判斷哪些需要緩存,哪些資源過期了需要請求,哪些資源可以不請求直接使用。
- push cache:http2中的內容。當以上三種都沒有命中時才使用。緩存時間短,會話結束就被釋放。
3,緩存策略
一:強緩存:強緩存可以通過設置header的Expires和Cache-Control,表示在緩存期間不用請求,status為200
1,Expires
Expires: Fri, 17 Dec 2021 11:11:00 GMT
表示在2021年12月17 11:11:00后會過期,需要再次請求。判斷是基於本地時間處理的,修改本地時間會造成緩存過期
2,Cache-Control
Cache-control: max-age=60
優先級高於Expires,表示在60秒后過期,需要再次請求。
二:協商緩存:緩存過期,就需要發起請求驗證資源是不是更新了。可以通過設置header的Last-Modified和ETag
1,Last-Modified和If-Modified-Since
Last-Modified為本地文件最后修改日期,If-Modified-Since會發送該值查詢是否有更新,如果有更新則返回更新的資源,否則返回304狀態碼
本地打開緩存文件,即使沒修改也會造成Last-Modified被更改,浪費請求
Last-Modified只能以秒計時,如果在1秒之內的改變文件,服務端還是會以為文件沒有改變,不能獲取最新資源
2,ETag和If-None-Match
優先級比Last-Modified高,ETag類似文件指紋,If-None-Match會將ETag發送到服務端,如果指紋有改變,則返回新的資源。
4,實際使用
對頻繁變動的資源,Cache-Control設置為no-cache使每次都發送請求,再配合ETag和Last-Modified來驗證資源是否過期。
代碼文件: 文件名進行hash處理,Cache-Control設置時間為一個長時間,這樣的話只有當hash變化的時候才去請求新資源,否則就一直使用緩存資源