前端緩存(進擊)

前言

????緩存一直是一個前端的痛點凹联,相信很多前端在面試的時候,大多是都遇到過緩存問題。接下來我們一起來學(xué)習(xí)


優(yōu)點

相信大家都知道緩存的好處未辆,那這里還是再簡單的嘮叨一下~~
緩存是用來提高性能的一項必不可少的技術(shù) ,利用這項技術(shù)可以很好地提高web的性能:
1.打開本地資源速度當(dāng)然比請求回來再打開要快得多锯玛。
2.緩存可以很有效地降低網(wǎng)絡(luò)的時延咐柜,同時也會減少大量請求對于服務(wù)器的壓力。
3.緩存可以減少帶寬消耗攘残。


一個小的概念

????首先我們要知道——緩存實際上就是——請求資源的拷貝拙友。

????思考一個小問題——如果每次請求都將資源保存下來,那豈不是很傻逼的做法嗎歼郭?內(nèi)存被大量的消耗遗契,開發(fā)者不易維護,沒有固定的協(xié)議告訴我病曾,這個緩存什么時候過期牍蜂,什么時候需要請求新的資源,之前的緩存的資源在本次請求中是否還有用泰涂,自然的鲫竞,客戶端也會崩潰。

????如何解決——那就是利用HTTP協(xié)議逼蒙,HTTP協(xié)議是我們每次請求必經(jīng)之路贡茅,那么通過HTTP協(xié)議來確定上面的這些問題在合適不過了。


緩存分類

第一種分類:
1. 共享緩存:各級代理緩存的資源。
2. 私有緩存:用戶專有的資源顶考。

第二種分類(后端---->前端):
1. 數(shù)據(jù)庫緩存:
????對于系統(tǒng)一些非常復(fù)雜的查詢赁还,可以將查詢到的結(jié)果保存在內(nèi)存中,下次就不需要查詢數(shù)據(jù)庫驹沿,導(dǎo)致數(shù)據(jù)庫鴨梨三大艘策,而是直接從內(nèi)存中讀取即可。
2. 網(wǎng)關(guān)緩存:
????也被稱為“反向代理緩存”或“替代緩存”渊季。網(wǎng)關(guān)緩存起中介作用朋蔫,多半是網(wǎng)站管理員(公司專門的運維工程師、或UED或程序組某人Add)部署却汉,這樣更容易擴展與維護驯妄。可以有多種方法把請求路由到網(wǎng)關(guān)緩存合砂,但通常使用某種形式的負載均衡器青扔,使它們看起來像源服務(wù)器。[此處不深入展開]
3. 代理服務(wù)器緩存:
????也被稱為“正向代理緩存”翩伪,代理服務(wù)器緩存原理為成千上萬的用戶提供緩存機制微猖。每一次請求先發(fā)送到代理服務(wù)器上,代理服務(wù)器存在請求的數(shù)據(jù)缘屹,則返回給客戶端凛剥,不存在就轉(zhuǎn)發(fā)到源服務(wù)器并取得響應(yīng)結(jié)果后,再返回給客戶端轻姿。同一個緩存可能會被重用多次犁珠,減少響應(yīng)時間和帶寬以及源服務(wù)器的鴨梨。
4. 瀏覽器緩存:
????相信你開發(fā)某個網(wǎng)站時互亮,肯定使用過“清空緩存”來解決問題盲憎,這就是在清除緩存在本地磁盤上的資源數(shù)據(jù)。在本地緩存是非常有用的胳挎,訪問本地與發(fā)送請求接受請求饼疙,快了不知多少倍呢。

????對于上面幾種緩存慕爬,前端遇到最多的就是瀏覽器緩存了吧窑眯,接下來我們一起來深入理解瀏覽器緩存吧~


瀏覽器緩存

對于一個完整的HTTP GET請求緩存過程會包含幾個主要的步驟:
①客戶端讀取請求報文并且對報文進行解析, 提取URL和各種首部。
②查詢是否在本地有請求資源副本医窿,如果本地沒有資源副本就會從服務(wù)器上獲取資源磅甩,并且保存在本地。
或者:接著會進行查看資源副本是否足夠新鮮(新鮮度檢測)姥卢, 如果緩存已經(jīng)失效就會詢問服務(wù)器是否有任何更新卷要。
③服務(wù)器用新的首部和已緩存的主體來構(gòu)建一條響應(yīng)報文渣聚。
④服務(wù)器將響應(yīng)報文發(fā)送給客戶端。
⑤客戶端讀取響應(yīng)報文進行相應(yīng)的操作僧叉。

先來看一張瀏覽器緩存過程的的圖片奕枝,可以不看具體內(nèi)容,接下來我們會根據(jù)本圖詳細講解瀏覽器緩存~


緩存流程圖

劃重點:根據(jù)緩存處理方式的不同瓶堕,接著瀏覽器緩存又分為又會分為:強緩存階段隘道、協(xié)商緩存階段 、啟發(fā)式緩存階段郎笆。一起來看看吧~~


強緩存

? ? 在閱讀下面知識點谭梗,請自行解決請求頭和報文頭,三次握手等相關(guān)的網(wǎng)絡(luò)知識點宛蚓。好了激捏,接下來我們正式開始理解~~

????強緩存主要是響應(yīng)頭中的Cache-ControlExpires兩個字段進行控制的。
? ? Expires:HTTP/1.0中定義凄吏,指定了一個絕對的過期時期远舅,但設(shè)計之初存在著缺陷:如果本地時間和服務(wù)器時間相差太大,就會導(dǎo)致緩存錯亂竞思。
? ? Cache-Control:HTTP 1.1中定義表谊,Cache-Control:max-age定義了一個最大使用期钞护,就是從第一次生成文檔到緩存不再生效的合法生存時間盖喷。
? ? 同時使用:當(dāng)然是HTTP協(xié)議高的優(yōu)先級高,不然要再來一個緩存字段干嘛难咕?所以 Cache-Control > Expires课梳。

? ? 一個場景:當(dāng)瀏覽器再次訪問之前訪問過的CSS文件時,發(fā)現(xiàn)本地這個文件的緩存余佃,就根據(jù)上一次的響應(yīng)頭判斷是否過期暮刃,沒過期,使用緩存加載文件爆土。但是過期了呢椭懊??步势?請接著看~~

? ? 過期之后氧猬,ETag 和 Last-Modified 就開始參與強緩存的判斷了。
? ??Last-Modified:文件最后一次修改的時間坏瘩。
? ??ETag:對文件的一個標(biāo)記盅抚。可能是抗碰撞散列函數(shù)倔矾、最近修改時間戳的哈希值妄均、甚至只是一個版本號等等柱锹。


協(xié)商緩存

????強緩存機制如果檢測到緩存失效,就需要進行服務(wù)器再驗證丰包,這種緩存機制也稱作協(xié)商緩存禁熏。
? ? 1. 當(dāng)瀏覽器再次試圖訪問CSS文件,發(fā)現(xiàn)緩存過期烫沙,如果上一次的響應(yīng)頭中有ETag 和 Last-Modified匹层,就會在本次請求的請求頭里攜帶If-Moified-Since和If-None-Match這兩個字段,進入步驟2锌蓄。如果上一次的響應(yīng)頭中沒有ETag 和 Last-Modified升筏,就直接像服務(wù)器發(fā)送請求,進入步驟4瘸爽。
? ? 2. 服務(wù)器通過If-Moified-Since和If-None-Match這兩個字段來判斷資源是否有修改您访,如果有修改則返回狀態(tài)碼200和新的內(nèi)容,如果沒有修改返回狀態(tài)碼304剪决。
? ? 3. 瀏覽器收到200狀態(tài)碼灵汪,相當(dāng)于首次訪問這個文件,該怎么處理就怎么處理柑潦。瀏覽器收到304狀態(tài)碼享言,知道本地緩存雖然過期但仍然可以用,加載本地緩存渗鬼。
? ? 4. 根據(jù)新返回的響應(yīng)頭來設(shè)置緩存览露。


啟發(fā)式緩存

????瀏覽器用來確定緩存過期時間的字段一個都沒有時,那該怎么辦譬胎?瀏覽器進入啟發(fā)式緩存階段差牛。
????根據(jù)響應(yīng)頭中2個時間字段 Date 和 Last-Modified 之間的時間差值,取其值的10%作為緩存時間周期堰乔。
? ? 這個階段很容讓人忽視偏化,但實際上每時每刻都在發(fā)揮著作用。所以在今后開發(fā)過程中如果遇到默認(rèn)緩存的坑镐侯,要知道瀏覽器只是在遵循啟發(fā)式緩存協(xié)議而已巡李。


附加知識點

????關(guān)于緩存是從磁盤中獲取還是從內(nèi)存中獲取拗军,Chrome會根據(jù)本地內(nèi)存的使用率來決定緩存存放在哪件相,如果內(nèi)存使用率很高踊挠,放在磁盤里面,內(nèi)存的使用率很高會暫時放在內(nèi)存里面袜瞬。這就可以比較合理的解釋了為什么同一個資源有時是from memory cache有時是from disk cache的問題了怜俐。

memory or disk cache

完結(jié)

再去看看上邊的圖吧,很好的解釋了瀏覽器緩存過程~~

參考文章:前端性能優(yōu)化之緩存之路邓尤、緩存詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拍鲤,一起剝皮案震驚了整個濱河市贴谎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌季稳,老刑警劉巖擅这,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異景鼠,居然都是意外死亡仲翎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門铛漓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溯香,“玉大人,你說我怎么就攤上這事浓恶∶堤常” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵包晰,是天一觀的道長湿镀。 經(jīng)常有香客問我,道長伐憾,這世上最難降的妖魔是什么勉痴? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮树肃,結(jié)果婚禮上蒸矛,老公的妹妹穿的比我還像新娘。我一直安慰自己扫外,他們只是感情好莉钙,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布廓脆。 她就那樣靜靜地躺著筛谚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪停忿。 梳的紋絲不亂的頭發(fā)上驾讲,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音席赂,去河邊找鬼吮铭。 笑死,一個胖子當(dāng)著我的面吹牛颅停,可吹牛的內(nèi)容都是我干的谓晌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼癞揉,長吁一口氣:“原來是場噩夢啊……” “哼纸肉!你這毒婦竟也來了溺欧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柏肪,失蹤者是張志新(化名)和其女友劉穎姐刁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烦味,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡聂使,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谬俄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柏靶。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溃论,靈堂內(nèi)的尸體忽然破棺而出宿礁,到底是詐尸還是另有隱情,我是刑警寧澤蔬芥,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布梆靖,位于F島的核電站,受9級特大地震影響笔诵,放射性物質(zhì)發(fā)生泄漏返吻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一乎婿、第九天 我趴在偏房一處隱蔽的房頂上張望测僵。 院中可真熱鬧,春花似錦谢翎、人聲如沸捍靠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榨婆。三九已至,卻和暖如春褒侧,著一層夾襖步出監(jiān)牢的瞬間良风,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工闷供, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烟央,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓歪脏,卻偏偏與公主長得像疑俭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子婿失,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355