HTTP緩存是客戶端向服務(wù)器請求資源時籍嘹,會先獲取瀏覽器的緩存闪盔,如果瀏覽器有相應(yīng)的副本,則可以直接用副本辱士,不用再請求資源泪掀。瀏覽器只能緩存GET請求的資源。
HTTP緩存的分類
- 強(qiáng)緩存
如果瀏覽器的緩存沒有失效颂碘,則直接使用緩存异赫,不會再去服務(wù)器請求資源。http請求會返回200的狀態(tài)碼头岔。
這種方式加載速度最快塔拳,性能最好。但是如果服務(wù)器端更新了資源峡竣,客戶端無法知曉靠抑,此時可以通過Ctrl+F5強(qiáng)制刷新。
- 協(xié)商緩存
協(xié)商緩存需要和服務(wù)器交互澎胡,每次客戶端請求資源時孕荠,都會請求服務(wù)器,服務(wù)器會查看一下資源是否已經(jīng)更新攻谁,如果更新了,則返回新的資源弯予,狀態(tài)碼為200戚宦;如果沒有更新,則返回304(Not Modified)锈嫩,告知客戶端可以使用緩存數(shù)據(jù)受楼。
HTTP緩存機(jī)制
HTTP緩存獲取數(shù)據(jù)的流程的如下圖:
涉及到的消息頭主要有:
- cache-control:
cache-control主要有以下選擇:
public
:響應(yīng)可以被任何對象(客戶端或者代理服務(wù)器等)緩存。
private
:響應(yīng)可以被單個用戶緩存呼寸,代理服務(wù)器不可緩存艳汽。
no-cache
:使用協(xié)商緩存,與服務(wù)器確認(rèn)对雪。
no-store
: 禁用緩存河狐,不緩存任何信息。
max-age
:緩存有效的最大時間。
- Last-Modified / If-Modified-Since:
Last-Modified
是請求資源時服務(wù)器返回的最后修改時間馋艺。
如果客戶端的緩存過期(通過cache-control里的max-age判斷)栅干,并且資源有Last-Modified
聲明,則請求資源時會帶上If-Modified-Since
頭部(值為Last-Modified
)給服務(wù)器捐祠。
服務(wù)器通過該頭部判斷資源是否需要更新碱鳞,返回200(需要更新,返回新資源)或者304(不需要更新)踱蛀。
- ETag / If-None-Match
ETag
是資源的版本標(biāo)識符窿给。
如果客戶端的緩存過期(同樣也是通過cache-control里的max-age判斷),并且資源有ETag
聲明率拒,則請求資源時會帶上If-None-Match
頭部(值為ETag
)給服務(wù)器填大。
服務(wù)器通過該頭部判斷資源是否為當(dāng)前最新的資源,從而判斷是否需要更新俏橘,返回200(需要更新允华,返回新資源)或者304(不需要更新)。
Last-Modified與ETag同時存在寥掐,怎么辦靴寂?
服務(wù)器會優(yōu)先驗(yàn)證ETag,因?yàn)镋Tag比Last-Modified能更精準(zhǔn)的判斷資源是否為最新的召耘。Last-Modified是秒級單位百炬,如果某些文件在1秒鐘以內(nèi),被修改多次的話污它,它將不能準(zhǔn)確標(biāo)注文件的修改時間剖踊。
參考文獻(xiàn):
一張圖理解Http緩存
瀏覽器 HTTP 協(xié)議緩存機(jī)制詳解