4種緩存方式
分類和區(qū)別
- 強緩存: 規(guī)定了過期時間
| 響應(yīng)header | 描述 | 常用響應(yīng)返回內(nèi)容 | 推薦 | 特點 | 缺點 | 場景 |
|---|---|---|---|---|---|---|
| Cache-Control | 在多少秒內(nèi)進行緩存 | public, max-age=秒 | 是 | 固定時間 | ||
| Expires | 在此時間前進行緩存 | 格林威治時間 | 否 | 絕對時間 | 受客戶端時間影響 | 兼容http1.0 |
- 協(xié)商緩存: 需進行比較,會返回
304狀態(tài)碼
| 響應(yīng)header | 請求header | 描述 | 常用響應(yīng)返回內(nèi)容 | 推薦 | 特點 | 缺點 | 場景 |
|---|---|---|---|---|---|---|---|
| ETag | If-None-Match | 固定字符串 | md5 | 是 | 檢測文件完整性 | ||
| Last-Modified | If-Modified-Since | 在某時間后沒再更改 | 格林威治時間 | 否 | 瀏覽器根據(jù)返回的時間自己決定緩存 | 瀏覽器差異 |
Tips:
Cache-Control與Expires一樣,都是在某個時間未到來前進行緩存
默認第一個請求(主頁)的請求頭里會自動加上Cache-Control: max-age=0,這個請求無論響應(yīng)頭的Cache-Control是什么設(shè)置都不會緩存,減少請求次數(shù)同時減少下載次數(shù)
ETag方式通過檢查request.headers里的if-None-Match里的32位md5字符串來檢測文件完整性決定是否更新, 如果md5匹配成功則返回304,只減少下載次數(shù)
Cache-Control 與 Last-Modified / if-Modified-Since 比較
對于所有可以緩存的資源都可以同時使用這兩種策略進行緩存
Cache-Control/Expires的優(yōu)先級要高于Last-Modified/ETag
Cache-Control:
1設(shè)置固定過期時間
2文件在過期時間沒到之前都不進行請求也不進行下載更新
3解決方法只能通過加時間戳改變文件名解決Last-Modified / if-Modified-Since:
1通過給文件內(nèi)容進行哈希算法來確定文件內(nèi)容版本
2通過對請求頭if-Modified-Since的字符串來檢測文件內(nèi)容有沒改變
3文件內(nèi)容沒改變則不更新資源,跟請求資源的文件名關(guān)系不大但每次都需要請求
4可以通過標(biāo)識文件版本名、加長緩存時間的方式來減少304響應(yīng)。
結(jié)論
1需要兼容HTTP1.0的時候需要使用Expires,不然可以考慮直接使用Cache-Control
2需要處理一秒內(nèi)多次修改的情況,或者其他Last-Modified處理不了的情況,才使用ETag,否則使用Last-Modified。
3對于所有可緩存資源,需要指定一個Expires或Cache-Control,同時指定Last-Modified或者Etag。
4可以通過標(biāo)識文件版本名、加長緩存時間的方式來減少304響應(yīng)。
HTTP緩存控制參考
MD5
hash算法
任何文件或數(shù)據(jù)都可以通過MD5算法轉(zhuǎn)化成一個32位的固定字符串
場景:
1檢查緩存的文件內(nèi)容是否有變化
2檢查下載文件是否下載完畢(cat xxx.mp4 | md5)