八股文--瀏覽器緩存機制

瀏覽器緩存

緩存位置:

? ? Service Worker:

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

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

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

?????Memory Cache:

? ? ? ????1.Memory Cache是內存中的緩存,主要包含的是當前中頁面中已經抓取到的資源,例如頁面上已經下載的樣式鳍置、腳本登疗、圖片

? ? ? ? ? ? ?等

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

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

? ? Disk Cache:

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

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

? ????? ? 3.當前系統(tǒng)內存使用率高的話稠歉,文件優(yōu)先存儲進硬盤

? ? Push Cache

? ? ????? 1.Push Cache(推送緩存)是 HTTP/2 中的內容掰担,當以上三種緩存都沒有命中時,它才會被使用怒炸。

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


緩存策略:

? ? 強緩存:

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

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

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

? ? ????? 4.不關心服務器端文件是否已經更新

? ? ????? 5.強緩存可以通過設置兩種HTTP Header實現(xiàn):Expires 和 Cache-Control恢口。

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

? ? ? ? ????????????? 1.緩存過期時間,用來指定資源到期的時間穷躁,是服務器端的具體的時間點

? ? ? ? ????????????? 2.需要和Last-modified結合使用

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

? ? ? ? ????????????? 4.Expires 是 HTTP/1 的產物耕肩,受限于本地時間因妇,如果修改了本地時間,可能會造成緩存失效

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

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

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

????????????????????????源梳虽,就會命中強緩存址芯。

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

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

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

? ? ? ? ? ? ? ? ? ? ? ? ? ? 3)no-cache:客戶端緩存內容窜觉,是否使用緩存則需要經過協(xié)商緩存來驗證決定谷炸,確認一下數(shù)據(jù)是否還跟服務? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 器保持一致

? ? ? ? ? ????????????????? 4)no-store:所有內容都不會被緩存,即不使用強制緩存禀挫,也不使用協(xié)商緩存

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

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

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

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

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

? ? 協(xié)商緩存:

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

? ? ? ? ? ? ? ? ?程

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

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

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

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

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

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

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

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

? ? ? ? ????? 1.Etag是服務器響應請求時适室,返回當前資源文件的一個唯一標識(由服務器生成)嫡意,只要資源有變化,Etag就會重新生成

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

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

? ? ? ? 區(qū)別:

? ? ? ????????? 1.Last-Modified如果本地打開緩存文件,即使沒有對文件進行修改汽畴,但還是會造成 Last-Modified 被修改旧巾,服務端不能

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

? ? ? ????????? 2.Last-Modified只能以秒計時,如果在不可感知的時間內修改完成文件忍些,那么服務端會認為資源還是命中了鲁猩,不會返

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

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

? ? ? ? ???????? 4.負載均衡的服務器罢坝,各個服務器生成的Last-Modified也有可能不一致

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

? ? ? ????????? 6.在優(yōu)先級上隙券,服務器校驗優(yōu)先考慮Etag

緩存機制

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

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

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

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

如果什么緩存策略都沒設置,那么瀏覽器會怎么處理脚乡?

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

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

實際場景應用緩存策略:

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

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

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

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

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末紧卒,一起剝皮案震驚了整個濱河市侥衬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跑芳,老刑警劉巖轴总,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異博个,居然都是意外死亡怀樟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門坡倔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漂佩,“玉大人脖含,你說我怎么就攤上這事⊥恫酰” “怎么了养葵?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘩缆。 經常有香客問我关拒,道長,這世上最難降的妖魔是什么庸娱? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任着绊,我火速辦了婚禮,結果婚禮上熟尉,老公的妹妹穿的比我還像新娘归露。我一直安慰自己,他們只是感情好斤儿,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布剧包。 她就那樣靜靜地躺著,像睡著了一般往果。 火紅的嫁衣襯著肌膚如雪疆液。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天陕贮,我揣著相機與錄音堕油,去河邊找鬼。 笑死肮之,一個胖子當著我的面吹牛掉缺,可吹牛的內容都是我干的。 我是一名探鬼主播局骤,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼攀圈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了峦甩?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤现喳,失蹤者是張志新(化名)和其女友劉穎凯傲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗦篱,經...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡冰单,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灸促。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诫欠。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡涵卵,死狀恐怖,靈堂內的尸體忽然破棺而出荒叼,到底是詐尸還是另有隱情轿偎,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布被廓,位于F島的核電站坏晦,受9級特大地震影響,放射性物質發(fā)生泄漏嫁乘。R本人自食惡果不足惜昆婿,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜓斧。 院中可真熱鬧仓蛆,春花似錦、人聲如沸挎春。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搂蜓。三九已至狼荞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帮碰,已是汗流浹背相味。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留殉挽,地道東北人丰涉。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像斯碌,于是被迫代替她去往敵國和親一死。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內容