強快取和協商快取–終結篇
- 2020 年 3 月 18 日
- 筆記
瀏覽器快取是指瀏覽器在本地磁碟對用戶最近請求過的資源進行存儲。通過快取,可以減少瀏覽器與伺服器的通訊次數,提升網站的性能。瀏覽器快取分為強快取和協商快取。
強快取
介紹
瀏覽器在請求資源文件時,首先會判斷是否命中強快取。根據該資源快取的header資訊,依據expires和cache-control欄位判斷是否命中強快取,若命中則直接從快取中獲取資源,返回狀態碼200,不再繼續向伺服器發起請求。
相關狀態碼
200
相關欄位
Expries
該欄位是http1.0時的規範,其值為一個絕對時間的GMT格式的時間字元串,如Wen, 18 Mar 2020 17:25:00 GMT,如果發送請求的時間在該值之前,則判斷其命中強快取。
Cache-Control
http1.1時的規範,該欄位有五個相關屬性可設置:
max-age:其值為一個數字,表示多少秒,代表快取的最大相對時間。如設置Cache-Control:max-age=500
,則從資源最後一次從伺服器獲取的時間開始計算,500秒之後過期。
pubilc:瀏覽器和代理伺服器都可以對資源進行快取。
privite:只有瀏覽器可以快取,代理伺服器不能快取。
no-cache:無法使用強快取,可以使用協商快取。
no-store:所有快取都無法使用。
協商快取
介紹
瀏覽器若沒用命中強快取,則會繼續判斷是否命中協商快取。若命中協商快取,則返回狀態碼304,代表資源已存在,直接從快取中取資源,不再向瀏覽器發起請求;否則,則會重新向瀏覽器請求資源。
相關狀態碼
304
相關欄位
Etag/If-None-Match
Etag是一個資源唯一標識符,當資源發生改變該標識符就會變化,它是一個hash編碼值。當瀏覽器第一次訪問某個資源時,返回的資源會帶有一個Etag標識符,瀏覽器再次訪問該資源時,請求頭中會帶有一個If-None-Match的欄位,它的值就是上次返回的Etag的值。然後將If-None-Match與新的Etag進行校驗看是否一致,若一致,若一致,則繼續判斷last-modefied是否一致;若不一致,則重新請求伺服器資源。
Last-Modified/If-Modified-Since
Last-Modified是一個的GMT格式的時間字元串,表示資源最後修改時間。當瀏覽器第一次訪問某個資源時,返回的資源會帶有一個Last-Modified標識符,瀏覽器再次訪問該資源時,請求頭中會帶有一個If-Modified-Since的欄位,它的值就是上次返回的Last-Modified的值。然後將If-Modified-Since與新的Last-Modified進行校驗看是否一致,則命中協商快取。
Etag和Last-Modified區別
- Etag要優於Last-Modified。Last-Modified的時間單位最小是秒,如果某個文件在1秒內改變了多次,那麼他們的Last-Modified其實並沒有體現出來修改,但是Etag每次都會改變確保了精度。
- 在性能上,Etag要遜於Last-Modified,畢竟Last-Modified只需要記錄時間,而Etag需要伺服器通過演算法來計算出一個hash值。
- 在優先順序上,伺服器校驗優先考慮Etag。