一、什么是http緩存
http緩存就是在瀏覽器從服務端請求的資源,通過緩存規則保存在瀏覽器本地,二次請求的時候不再從服務端獲取
而是直接從本地獲取緩存資源,降低了 服務器壓力,提升了加載速度
二、緩存規則
1、強制緩存
首次請求服務端資源時,服務端會在Response Headers 中寫入緩存時間。當請求再次發出時,
如果緩存時間內,將直接從緩存獲取資源,而不會再與服務器發生通信。
如果不在緩存時間內,與服務器發生通信。
主要通過兩個字段控制:
Expires:Expires字段后面會接一個絕對時間,在這個絕對時間之前強緩存有效,Expires目前已經廢棄
Cache-Control:Cache-Control 是 Expires 的替代方案,可以有幾個值:
max-age : 單位秒,緩存在這個max-age最大時間內有效
no-cache:跳過強制緩存,采用協商緩存
no-store:完全不緩存
2、協商緩存
協商緩存機制下,瀏覽器需要向服務器去詢問緩存的相關信息,進而判斷是重新發起請求,還是從本地獲取緩存的資源
兩個控制字段:
Last-Modified:標識的是資源在服務器上的最后修改時間,當第一次請求的時候,服務會返回 Last-Modified ,當再次請求的時候請求頭
會帶上 If-Modified-Since
:xx(第一次請求返回的 Last- Modified的值),服務器會對比資源在最后修改時間之后是否有變動,有則返回新的資源,
沒有則返回 304
Etag:Etag 是由服務器為每個資源生成的唯一的標識字符串,當第一次請求的時候,服務會返回 Etag 值 ,當再次請求的時候請求頭
會帶上 if-None-Match:xx(第一次請求返回的 Etag 的值),這個標識字符串是基於文件內容編碼的,只要文件內容不同
它們對應的 Etag 就是不同的,因此 Etag 能夠精准地感知文件的變化,Etage也是Last-Modified的替代方案
三:緩存讀取
瀏覽器緩存到底緩存在哪里?
from memory cache代表使用內存中的緩存
from disk cache則代表使用的是硬盤中的緩存
-
內存緩存(from memory cache):內存緩存具有兩個特點,分別是快速讀取和時效性:
-
快速讀取:內存緩存會將編譯解析后的文件,直接存入該進程的內存中,占據該進程一定的內存資源,以方便下次運行使用時的快速讀取。
-
時效性:一旦該進程關閉,則該進程的內存則會清空。
-
硬盤緩存(from disk cache):硬盤緩存則是直接將緩存寫入硬盤文件中,讀取緩存需要對該緩存存放的硬盤文件進行I/O操作,然后重新解析該緩存內容,讀取復雜,速度比內存緩存慢。
在瀏覽器中,瀏覽器會在js和圖片等文件解析執行后直接存入內存緩存中,那么當刷新頁面時只需直接從內存緩存中讀取(from memory cache);而css文件則會存入硬盤文件中
所以每次渲染頁面都需要從硬盤讀取緩存(from disk cache)。