瀏覽器緩存機(jī)制

簡單來說考廉,瀏覽器緩存就是把一個已經(jīng)請求過的資源拷貝一份存儲起來茉继,當(dāng)下次需要該資源時(shí)翼闹,瀏覽器會根據(jù)緩存機(jī)制決定直接使用緩存資源還是再次向服務(wù)器發(fā)送請求丁寄。

如下圖所示是我在第二次打開某個網(wǎng)頁時(shí)的資源請求圖柑营,可以看出里面大部分資源是從瀏覽器直接讀取了緩存屈雄。

讀取緩存資源

那么瀏覽器緩存究竟有什么作用呢?

瀏覽器緩存最主要的作用是減少網(wǎng)絡(luò)傳輸?shù)膿p耗以及降低服務(wù)器壓力官套。

接下來我將通過以下幾個部分來探討瀏覽器緩存機(jī)制:

  • 緩存位置
  • 緩存策略
緩存位置

瀏覽器緩存位置分為四種酒奶,其優(yōu)先級順序如下:

  1. Service Worker
  2. Memory Cache
  3. Disk Cache
  4. Push Cache

當(dāng)上述四個緩存位置中的緩存都沒有命中時(shí)蚁孔,則會向服務(wù)器發(fā)起請求。

Service Worker

Service Worker 是一個注冊在指定源和路徑下的事件驅(qū)動 worker讥蟆。它采用 JavaScript 控制關(guān)聯(lián)的頁面或者網(wǎng)站遍膜,攔截并修改訪問和資源請求,細(xì)粒度地緩存資源转绷。

我們可以通過谷歌開發(fā)者工具中的 Application -> Service Workers 查看當(dāng)前緩存的資源徊哑。

Memory Cache

Memory Cache 即內(nèi)存中的緩存,其特點(diǎn)是容量小质况、讀取高效愕宋、持續(xù)性短,會隨著進(jìn)程的釋放而釋放结榄。

所以中贝,在內(nèi)存使用率低、緩存小尺寸資源時(shí)臼朗,會以 Memory Cache 為優(yōu)先邻寿,否則使用 Disk Cache。

Disk Cache

Disk Cache 即磁盤中的緩存视哑,其特點(diǎn)是容量大绣否、讀取緩慢、持續(xù)性長挡毅,任何資源都能存儲到磁盤中蒜撮。

所以,在內(nèi)存使用率高跪呈、緩存大尺寸資源時(shí)段磨,會以 Disk Cache 為優(yōu)先。

Push Cache

Push Cache 是 HTTP 2.0 中的內(nèi)容耗绿,其緩存時(shí)間也很短暫苹支,只在會話(Session)中存在,一旦會話結(jié)束就被釋放误阻。

緩存策略

瀏覽器每次在向服務(wù)器發(fā)起 HTTP 請求獲得資源后沐序,可能會根據(jù)不同情況(可能是代碼控制如 Service Worker、Push Cache堕绩,也可能是根據(jù) HTTP Header 的緩存標(biāo)識字段)將資源緩存起來策幼。

瀏覽器緩存策略分為強(qiáng)制緩存協(xié)商緩存,其是通過設(shè)置 HTTP Header 來實(shí)現(xiàn)的奴紧。

強(qiáng)制緩存

當(dāng)瀏覽器發(fā)起 HTTP 請求時(shí)特姐,會依次查找上述緩存位置中是否存在緩存資源并通過緩存標(biāo)識字段 Expires 或 Cache-Control 來驗(yàn)證緩存資源是否過期。

Expires 是服務(wù)器端在響應(yīng)請求時(shí)用來規(guī)定資源的失效時(shí)間黍氮。

Cache-Control 是服務(wù)器端在響應(yīng)請求時(shí)用來規(guī)定資源是否需要被瀏覽器緩存以及緩存的有效時(shí)間等唐含。

「Response Header」Expires 與 Cache-Control

Cache-Control 主要取值如下:

Cache-Control 取值

Expires 是 HTTP 1.0 的字段浅浮,而 Cache-Control 是 HTTP 1.1 的字段,當(dāng) Expires 與 Cache-Control 同時(shí)存在時(shí)捷枯,Cache-Control 的優(yōu)先級要高于 Expires滚秩。

若是命中緩存(即存在緩存資源并且緩存資源未過期),則瀏覽器響應(yīng) HTTP Status Code 200淮捆,并直接使用緩存資源作為返回結(jié)果郁油,不需要發(fā)起 HTTP 請求;若是存在緩存資源但緩存資源已過期攀痊,則進(jìn)入協(xié)商緩存桐腌。

協(xié)商緩存

與協(xié)商緩存相關(guān)的緩存標(biāo)識字段是 Last-ModifiedEtag

Last-Modified 是服務(wù)器端在響應(yīng)請求時(shí)用來說明資源的最后修改時(shí)間苟径。與之對應(yīng)的是 If-Modified-Since 字段案站,在協(xié)商緩存過程中,瀏覽器發(fā)送的 HTTP 請求中 Header 中會帶上 If-Modified-Since 字段棘街,值為緩存資源 Last-Modified 屬性的值蟆盐。

當(dāng)服務(wù)器端接收到帶有 If-Modified-Since 的請求時(shí),則會將 If-Modified-Since 的值與被請求資源的最后修改時(shí)間做對比遭殉。如果相同舱禽,說明資源沒有新的修改,則響應(yīng) HTTP Status Code 304恩沽,瀏覽器會繼續(xù)使用緩存資源;如果最后修改時(shí)間比較新翔始,則說明資源被修改過罗心,則響應(yīng) HTTP Status Code 200,并返回最新的資源城瞎。

Etag 是服務(wù)器端在響應(yīng)請求時(shí)用來說明資源在服務(wù)器端的唯一標(biāo)識渤闷。與之對應(yīng)的是 If-None-Match 字段,在協(xié)商緩存過程中脖镀,瀏覽器發(fā)送的 HTTP 請求中 Header 中會帶上 If-None-Match 字段飒箭,值為該緩存資源 Etag 屬性的值。

當(dāng)服務(wù)器端接收到帶有 If-None-Match 的請求時(shí)蜒灰,則會將 If-None-Match 的值與被請求資源的唯一標(biāo)識做對比弦蹂。如果相同,說明資源沒有新的修改强窖,則響應(yīng) HTTP Status Code 304凸椿,瀏覽器會繼續(xù)使用緩存資源;如果不同翅溺,則說明資源被修改過脑漫,則響應(yīng) HTTP Status Code 200髓抑,并返回最新的資源。

「Response Header」Etag
「Request Header」If-None-Match

Last-Modified 是 HTTP 1.0 的字段优幸,而 Etag 是 HTTP 1.1 的字段吨拍,當(dāng) Last-Modified 與 Etag 同時(shí)存在時(shí),Etag 的優(yōu)先級要高于 Last-Modified网杆。

Etag 的出現(xiàn)主要是為了解決 Last-Modified 存在的問題:

  • Last-Modified 標(biāo)注的最后修改只能精確到秒級羹饰,如果某些文件在 1 秒鐘以內(nèi)被修改多次的話,它將不能準(zhǔn)確標(biāo)注文件的最后修改時(shí)間跛璧;
  • 如果本地打開緩存文件严里,即使沒有對文件進(jìn)行修改,但 Last-Modified 卻改變了追城,導(dǎo)致文件沒法使用緩存刹碾;

下面用一張流程圖來完整說明當(dāng)瀏覽器發(fā)起 HTTP 請求時(shí)緩存機(jī)制的過程:

瀏覽器緩存機(jī)制流程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市座柱,隨后出現(xiàn)的幾起案子迷帜,更是在濱河造成了極大的恐慌,老刑警劉巖色洞,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戏锹,死亡現(xiàn)場離奇詭異,居然都是意外死亡火诸,警方通過查閱死者的電腦和手機(jī)锦针,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來置蜀,“玉大人奈搜,你說我怎么就攤上這事《⒒纾” “怎么了馋吗?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秋秤。 經(jīng)常有香客問我宏粤,道長,這世上最難降的妖魔是什么灼卢? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任绍哎,我火速辦了婚禮,結(jié)果婚禮上鞋真,老公的妹妹穿的比我還像新娘蛇摸。我一直安慰自己,他們只是感情好灿巧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布赶袄。 她就那樣靜靜地躺著揽涮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饿肺。 梳的紋絲不亂的頭發(fā)上蒋困,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音敬辣,去河邊找鬼雪标。 笑死,一個胖子當(dāng)著我的面吹牛溉跃,可吹牛的內(nèi)容都是我干的村刨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼撰茎,長吁一口氣:“原來是場噩夢啊……” “哼嵌牺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起龄糊,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤逆粹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后炫惩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僻弹,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年他嚷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹋绽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡筋蓖,死狀恐怖卸耘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扭勉,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布苛聘,位于F島的核電站涂炎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏设哗。R本人自食惡果不足惜唱捣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望网梢。 院中可真熱鬧震缭,春花似錦、人聲如沸战虏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巡社,卻和暖如春膛堤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晌该。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工肥荔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朝群。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓燕耿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姜胖。 傳聞我的和親對象是個殘疾皇子誉帅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容