瀏覽器緩存機制也就是http緩存機制,其機制是根據http報文的緩存標識進行的,http報文分爲兩種,一種請求報文,一種響應報文。css
http請求報文(request):請求行 – HTTP頭(通用信息頭,請求頭,實體頭) – 請求報文主體(只有POST纔有報文主體)瀏覽器
http響應報文(response):狀態行 – HTTP頭(通用信息頭,響應頭,實體頭) – 響應報文主體緩存
通用信息頭指的是請求和響應報文都支持的頭域,分別爲Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via;實體頭則是實體信息的實體頭域,分別爲Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD五、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。這裏只是爲了方便理解,將通用信息頭,響應頭/請求頭,實體頭都歸爲了HTTP頭。服務器
緩存過程:代理
瀏覽器發起請求,服務器響應請求。瀏覽器拿到請求結果,根據響應頭緩存標識,決定是否緩存結果,將請求結果和緩存標識存入瀏覽器緩存中。進程
瀏覽器每次發起請求,都會在瀏覽器緩存中查找該請求的結果和緩存標識圖片
瀏覽器拿到請求結果,根據響應頭緩存標識,決定是否緩存結果。內存
是否須要從新向服務器發起請求,有兩套緩存方案:強制緩存和協商緩存資源
強制緩存:強制緩存就是向瀏覽器緩存中查找該次請求結果,再根據查找結果的緩存規則決定是否使用該該緩存結果的過程。三種狀況:io
1.不存在該緩存結果和緩存標識,強制緩存失效,直接向服務器發起請求
2.存在該緩存結果和緩存標識,可是該結果已失效,強制緩存失效,使用協商緩存
3.存在該緩存結果和緩存標識,且結果還沒有失效,強制緩存生效,直接返回該結果
強制緩存規則:
當瀏覽器向服務器發起請求時,服務器會將緩存規則放入HTTP響應報文的HTTP頭中和請求結果一塊兒返回給瀏覽器,控制強制緩存的字段分別是Expires和Cache-Control,其中Cache-Control優先級比Expires高。
Expires:Expires是HTTP/1.0控制網頁緩存的字段,其值爲服務器返回該請求結果緩存的到期時間,即再次發起該請求時,若是客戶端的時間小於Expires的值時,直接使用緩存結果。
Cache-Control:在HTTP/1.1中,Cache-Control是最重要的規則,主要用於控制網頁緩存,主要取值爲:
協商緩存規則:
強制緩存的第二種狀況,強制緩存失效,瀏覽器攜帶緩存標識向服務器發起請求,由服務器根據緩存標識來決定是否使用緩存。兩種狀況:
1.協商緩存生效,返回304
2.協商緩存失效,返回200和請求結果
協商緩存的緩存標識也是經過響應頭和響應結果一塊兒返回給瀏覽器的,控制緩存字段有:Last-Modified/If-Modified-Since和Etag/If-None-Match;其中Etag/If-None-Match的優先級比Last-Modified/If-Modified-Since高。
Last-Modified / If-Modified-Since:
1.Last-Modified:是服務器響應請求時,返回資源文件最後修改的時間
2.If-Modified-Since:客戶端再次發起請求時,攜帶上次請求返回的Last-Modified的值。服務器收到請求,會將If-Modifined-Since的值和該資源在服務器最後修改的時間對比,若大於If-Modifined-Since的值,則返回200和請求的資源;不然返回304,資源文件未修改,瀏覽器可繼續使用;
Etag / If-None-Match:
1.Etag:Etag是服務器響應請求時,返回當前資源的惟一標識(服務器生成)
2.If-None-Match:客戶端再次發起請求時,攜帶上次請求返回的Etag的值。服務器接到請求,會將If-None-Match的值和該資源文件在服務器的Etag值進行比較,一致返回304,資源文件未修改,瀏覽器可繼續使用;不然返回200和請求的資源
瀏覽器的緩存位置?
緩存存放的位置,分別爲from memory cache和 from disk cache。
from memory cache:表明內存中的緩存;兩個特色,讀取快和時效性;
讀取快:內存緩存會將編譯解析後的文件直接存入內存中,佔用該進程的必定內存資源,以便下次使用時,快速讀取;
時效性:一旦進程關閉,該進程的內存會清空;
from disk cache:表明硬盤中的緩存;
硬盤緩存則是直接將緩存寫入硬盤文件中,讀取緩存須要對該緩存存放的硬盤文件進行I/O操做,而後從新解析該緩存內容,讀取複雜,速度比內存緩存慢。
在瀏覽器中,瀏覽器會在js和圖片等文件解析執行後直接緩存到內存中,刷新頁面只需從內存緩存中讀取(from memory cache);而css文件則會緩存到硬盤文件中,因此每次渲染頁面都需從硬盤內存中讀取(from disk cache)
總結:強制緩存優先於協商緩存進行;.不存在該緩存結果和緩存標識,強制緩存失效,直接向服務器發起請求;存在該緩存結果和緩存標識,可是該結果已失效,強制緩存失效,使用協商緩存,若協商緩存失效,那麼表明該請求的緩存失效,從新獲取請求結果,再存入瀏覽器緩存中,生效則返回304,繼續使用緩存;存在該緩存結果和緩存標識,且結果還沒有失效,強制緩存生效,直接返回該結果