八股文--瀏覽器緩存機(jī)制

瀏覽器緩存

緩存位置:

? ? Service Worker:

? ? ? ????1.Service Worker 是運(yùn)行在瀏覽器背后的獨(dú)立線程,一般可以用來實(shí)現(xiàn)緩存功能

? ? ? ????2.傳輸協(xié)議必須為 HTTPS,因?yàn)?Service Worker 中涉及到請求攔截

? ? ? ? ? 3.Service Worker自由控制緩存哪些文件、如何匹配緩存、如何讀取緩存,并且緩存是持續(xù)性的

?????Memory Cache:

? ? ? ????1.Memory Cache是內(nèi)存中的緩存,主要包含的是當(dāng)前中頁面中已經(jīng)抓取到的資源,例如頁面上已經(jīng)下載的樣式、腳本、圖片

? ? ? ? ? ? ?等

? ? ? ????2.讀取內(nèi)存中的數(shù)據(jù)肯定比磁盤快,但緩存持續(xù)性很短,會隨著進(jìn)程的釋放而釋放。

? ? ????? 3.讓數(shù)據(jù)都存放在內(nèi)存中不可能,計(jì)算機(jī)中的內(nèi)存一定比硬盤容量小得多

? ? Disk Cache:

? ? ????? 1.Disk Cache 也就是存儲在硬盤中的緩存,讀取速度慢點(diǎn),但是什么都能存儲到磁盤中

? ? ????? 2.對于大文件來說,大概率是不存儲在內(nèi)存中的,反之優(yōu)先

? ????? ? 3.當(dāng)前系統(tǒng)內(nèi)存使用率高的話,文件優(yōu)先存儲進(jìn)硬盤

? ? Push Cache

? ? ????? 1.Push Cache(推送緩存)是 HTTP/2 中的內(nèi)容,當(dāng)以上三種緩存都沒有命中時,它才會被使用。

? ? ????? 2.它只在會話(Session)中存在,一旦會話結(jié)束就被釋放,并且緩存時間也很短暫,在Chrome瀏覽器中只有5分鐘左右


緩存策略:

? ? 強(qiáng)緩存:

? ? ????? 1.不會向服務(wù)器發(fā)送請求,直接從緩存中讀取資源

? ? ????? 2.在chrome控制臺的Network選項(xiàng)中可以看到該請求返回200的狀態(tài)碼,

? ? ????? 3.Size顯示from disk cache或from memory cache。

? ? ????? 4.不關(guān)心服務(wù)器端文件是否已經(jīng)更新

? ? ????? 5.強(qiáng)緩存可以通過設(shè)置兩種HTTP Header實(shí)現(xiàn):Expires 和 Cache-Control。

? ? ? ? ????????Expires(http1):

? ? ? ? ????????????? 1.緩存過期時間,用來指定資源到期的時間,是服務(wù)器端的具體的時間點(diǎn)

? ? ? ? ????????????? 2.需要和Last-modified結(jié)合使用

? ? ? ? ????????????? 3.告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器緩存取數(shù)據(jù)

? ? ? ? ????????????? 4.Expires 是 HTTP/1 的產(chǎn)物,受限于本地時間,如果修改了本地時間,可能會造成緩存失效

? ? ? ?????????Cache-Control(http1.1):

? ? ? ? ? ? ? ????????1.在HTTP/1.1中,Cache-Control是最重要的規(guī)則,主要用于控制網(wǎng)頁緩存

? ? ? ? ? ????????????2.Cache-Control:max-age=300時,則代表在這個請求正確返回時間(瀏覽器也會記錄下來)的5分鐘內(nèi)再次加載資

????????????????????????源,就會命中強(qiáng)緩存。

? ? ? ? ????????????? 3.指令集合:

? ? ? ? ? ????????????????? 1)public:所有內(nèi)容都將被緩存(客戶端和代理服務(wù)器都可緩存)

? ? ? ? ? ? ????????????????2)private:所有內(nèi)容只有客戶端可以緩存,Cache-Control的默認(rèn)取值

? ? ? ? ? ? ? ? ? ? ? ? ? ? 3)no-cache:客戶端緩存內(nèi)容,是否使用緩存則需要經(jīng)過協(xié)商緩存來驗(yàn)證決定,確認(rèn)一下數(shù)據(jù)是否還跟服務(wù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 器保持一致

? ? ? ? ? ????????????????? 4)no-store:所有內(nèi)容都不會被緩存,即不使用強(qiáng)制緩存,也不使用協(xié)商緩存

? ? ? ? ? ????????????????? 5)max-age:max-age=xxx (xxx is numeric)表示緩存內(nèi)容將在xxx秒后失效

? ? ? ? ????? ? ????????????6)s-maxage(單位為s):同max-age作用一樣,只在代理服務(wù)器中生效(比如CDN緩存)

? ? ? ? Expires與Cache-Control區(qū)別:

? ? ? ? ? ????1.Cache-Control優(yōu)先級高于Expires

? ? ? ? ????? 2.Expires其實(shí)是過時的產(chǎn)物,現(xiàn)階段它的存在只是一種兼容性的寫法。

? ? 協(xié)商緩存:

? ? ? ????????1.協(xié)商緩存就是強(qiáng)制緩存失效后,瀏覽器攜帶緩存標(biāo)識向服務(wù)器發(fā)起請求,由服務(wù)器根據(jù)緩存標(biāo)識決定是否使用緩存的過

? ? ? ? ? ? ? ? ?程

? ? ????????? 2.協(xié)商緩存可以通過設(shè)置兩種 HTTP Header 實(shí)現(xiàn):Last-Modified 和 ETag

? ? ? ? Last-Modified和If-Modified-Since(http1):

? ? ? ? ? ????1.瀏覽器在第一次訪問資源時,服務(wù)器返回資源的同時在response header中添加 Last-Modified的header,值是這個資

? ? ? ? ? ? ? ? ?源在服務(wù)器上的最后修改時間,瀏覽器接收后緩存文件和header

? ? ? ? ????? 2.下一次請求這個資源,添加If-Modified-Since這個header,值就是Last-Modified中的值

? ? ? ? ? ????3.服務(wù)器再次收到這個資源請求,會根據(jù) If-Modified-Since 中的值與服務(wù)器中這個資源的最后修改時間對比,沒有變化

????????????????返回304和空的響應(yīng)體直接從緩存讀取,修改時間說明文件有更新返回新的資源文件和200

? ? ? ? ETag和If-None-Match(http1.1):

? ? ? ? ????? 1.Etag是服務(wù)器響應(yīng)請求時,返回當(dāng)前資源文件的一個唯一標(biāo)識(由服務(wù)器生成),只要資源有變化,Etag就會重新生成

? ? ? ? ????? 2.瀏覽器在下一次加載資源向服務(wù)器發(fā)送請求時,會將上一次返回的Etag值放到request header里的If-None-Match里,

????????????????服務(wù)器只需要比較客戶端傳來的If-None-Match跟自己服務(wù)器上該資源的ETag是否一致

? ? ? ? 區(qū)別:

? ? ? ????????? 1.Last-Modified如果本地打開緩存文件,即使沒有對文件進(jìn)行修改,但還是會造成 Last-Modified 被修改,服務(wù)端不能

????????????????????命中緩存導(dǎo)致發(fā)送相同的資源

? ? ? ????????? 2.Last-Modified只能以秒計(jì)時,如果在不可感知的時間內(nèi)修改完成文件,那么服務(wù)端會認(rèn)為資源還是命中了,不會返

????????????????????回正確的資源

? ? ? ????????? 3.首先在精確度上,Etag要優(yōu)于Last-Modified

? ? ? ? ???????? 4.負(fù)載均衡的服務(wù)器,各個服務(wù)器生成的Last-Modified也有可能不一致

? ? ? ????????? 5.在性能上,Etag要遜于Last-Modified,畢竟Last-Modified只需要記錄時間,而Etag需要服務(wù)器通過算法來計(jì)算出一個hash值

? ? ? ????????? 6.在優(yōu)先級上,服務(wù)器校驗(yàn)優(yōu)先考慮Etag

緩存機(jī)制

? ? 強(qiáng)制緩存優(yōu)先于協(xié)商緩存進(jìn)行,若強(qiáng)制緩存(Expires和Cache-Control)生效則直接使用緩存,

? ? 若不生效則進(jìn)行協(xié)商緩存(Last-Modified / If-Modified-Since和Etag / If-None-Match),

? ? 協(xié)商緩存由服務(wù)器決定是否使用緩存,若協(xié)商緩存失效,那么代表該請求的緩存失效,返回200,

? ? 重新返回資源和緩存標(biāo)識,再存入瀏覽器緩存中;生效則返回304,繼續(xù)使用緩存

如果什么緩存策略都沒設(shè)置,那么瀏覽器會怎么處理?

? ? 對于這種情況,瀏覽器會采用一個啟發(fā)式的算法,通常會取響應(yīng)頭中的 Date

? ? 減去 Last-Modified 值的 10% 作為緩存時間。

實(shí)際場景應(yīng)用緩存策略:

? ? 1.頻繁變動的資源: Cache-Control: no-cache

? ? 2.不常變化的資源: Cache-Control: max-age=31536000

用戶行為對瀏覽器緩存的影響

? ? 1.打開網(wǎng)頁,地址欄輸入地址: 查找 disk cache 中是否有匹配。如有則使用;如沒有則發(fā)送網(wǎng)絡(luò)請求。

? ? 2.普通刷新 (F5):因?yàn)?TAB 并沒有關(guān)閉,因此 memory cache 是可用的,會被優(yōu)先使用(如果匹配的話)。其次才是 disk cache。

? ? 3.強(qiáng)制刷新 (Ctrl + F5):瀏覽器不使用緩存,因此發(fā)送的請求頭部均帶有 Cache-control: no-cache(為了兼容,還帶了 Pragma: no-cache),服務(wù)器直接返回 200 和最新內(nèi)容。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,908評論 2 372

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