HTTP緩存機制
當(dāng)用戶通過瀏覽器發(fā)起一個數(shù)據(jù)請求的時候,瀏覽器會通過以下幾步來獲取數(shù)據(jù):
- 本地緩存階段:先在本地查找該數(shù)據(jù)拜英,如果有發(fā)現(xiàn)該數(shù)據(jù),而且該數(shù)據(jù)還沒有過期衣洁,就使用此數(shù)據(jù)虱肄,不會發(fā)送http請求到服務(wù)器
- 協(xié)商緩存階段:如果在本地緩存找到對應(yīng)的數(shù)據(jù)致板,但是不知道該數(shù)據(jù)是否過期,則發(fā)一個HTTP請求到服務(wù)器咏窿,然后服務(wù)器判斷這個請求斟或,如果請求的數(shù)據(jù)在服務(wù)器上沒有改動過或過期,則返回304狀態(tài)碼(可以理解為服務(wù)器給瀏覽器的暗號)集嵌,讓瀏覽器在本地找到該數(shù)據(jù)
- 緩存失敗階段:當(dāng)服務(wù)器發(fā)現(xiàn)請求的資源已經(jīng)修改過萝挤,或者這是一個新的請求,服務(wù)器則返回該數(shù)據(jù)根欧,并且返回200狀態(tài)碼怜珍, 此過程的前提是指找到該數(shù)據(jù),如果服務(wù)器上沒有數(shù)據(jù)咽块,則返回404(這個大家多見過吧绘面,就是平時見到404頁面時的狀態(tài)碼)
瀏覽器中的操作對緩存的影響
- 強制刷新:當(dāng)按下ctrl+F5來刷新頁面的時候,瀏覽器將繞過各種緩存(本地緩存和協(xié)商緩存)侈沪, 直接讓服務(wù)器返回最新數(shù)據(jù)
- 普通刷新:當(dāng)按下F5或者點擊刷新按鈕來刷新頁面的時候揭璃,瀏覽器將繞過本地緩存發(fā)送請求給服務(wù)器,此時協(xié)商緩存是有效的
- 回車或跳轉(zhuǎn):當(dāng)在地址欄上輸入回車或者按下跳轉(zhuǎn)按鈕的時候亭罪,所有緩存都生效
WEB瀏覽器緩存
瀏覽器會緩存它瀏覽過的「資源」(包括網(wǎng)頁瘦馍,圖片等),如果資源在保質(zhì)期內(nèi)应役,那下次同樣的請求直接用緩存情组。過期之后,會帶上資源上次的修改時間箩祥,由服務(wù)器來判斷是否失效院崇,失效的話就會給瀏覽器返回新的數(shù)據(jù)并繼續(xù)緩存下來。
瀏覽器的緩存袍祖,存在用戶電腦的硬盤上底瓣,用戶每次使用瀏覽器讀取緩存時先將硬盤上的緩存數(shù)據(jù)加載到內(nèi)存中,再讀取給瀏覽器蕉陋。
瀏覽器端緩存的規(guī)則主要在HTTP協(xié)議頭和HTML的meta標(biāo)簽中定義捐凭。他們分別從新鮮度和校驗值兩個維度來規(guī)定瀏覽器是直接使用緩存中的數(shù)據(jù)拨扶,還是需要去源服務(wù)器獲取更新的版本。
新鮮度(過期機制):緩存數(shù)據(jù)保質(zhì)期茁肠。緩存數(shù)據(jù)必須滿足以下條件患民,瀏覽器會認為它是有效的,足夠新的:
- 含有完整的過期時間控制頭信息(HTTP協(xié)議報文頭)垦梆,并且仍在有效期內(nèi)
- 瀏覽器已經(jīng)使用過這個緩存數(shù)據(jù)匹颤,并且在上一次會話中(也就是用戶上一次訪問該數(shù)據(jù)時)已經(jīng)檢查過其新鮮度
滿足以上兩個情況的一種,瀏覽器會直接從緩存中獲取緩存數(shù)據(jù)并渲染給瀏覽器奶赔。
校驗值(驗證機制):服務(wù)器返回數(shù)據(jù)的時候有時在頭信息中帶上這個資源的實體標(biāo)簽惋嚎,它可以用來作為瀏覽器再次請求過程的校驗標(biāo)識。如過發(fā)現(xiàn)校驗標(biāo)識不匹配站刑,說明數(shù)據(jù)已經(jīng)被修改或過期另伍,瀏覽器需要重新獲取數(shù)據(jù)內(nèi)容。
補充:
移動APP上的緩存機制和瀏覽器緩存的原理類似绞旅,APP與服務(wù)器交互的協(xié)議同樣是大多基于HTTP(S)摆尝。
APP端存儲數(shù)據(jù)的時候,會存儲很多字段內(nèi)容因悲,一般情況下后臺會給每條數(shù)據(jù)設(shè)定一個獨立的id值堕汞,那么前端在請求數(shù)據(jù)的可以先查詢本地緩存的數(shù)據(jù)中,最新的一條數(shù)據(jù)的id值晃琳,通過網(wǎng)絡(luò)請求讯检,把這個id值發(fā)給服務(wù)端,服務(wù)端會根據(jù)這個id在后臺服務(wù)器中查詢是否有比這個id值更大(更新)的數(shù)據(jù)存在卫旱,如果有就把新的數(shù)據(jù)返回給前端APP人灼。