http緩存機(jī)制

介紹

http中的某些字段規(guī)定了客戶端和服務(wù)器之間應(yīng)該如何配合起來實(shí)現(xiàn)緩存機(jī)制,這樣一來缰犁,就極大的緩解了服務(wù)器的壓力,因?yàn)楹芏嗟恼?qǐng)求都是可以在客戶端這邊直接從緩存中拿到數(shù)據(jù)的穗椅,而不需要訪問服務(wù)器這邊或者就算訪問到了服務(wù)器蔓倍,服務(wù)器這邊發(fā)現(xiàn)資源并沒有改動(dòng)全肮,則直接不返回消息體敞咧,狀態(tài)碼給個(gè)304,讓客戶端這邊從緩存中讀取資源辜腺。

正文

這些字段名主要的大概有以下幾個(gè)休建,我將它們用請(qǐng)求頭和響應(yīng)頭中的字段來分別介紹:

請(qǐng)求頭:if-modified-since,if-none-match哪自,cache-control丰包,pragma
響應(yīng)頭:cache-control禁熏,etag壤巷,last-modified,date瞧毙,expires

接下來我將一一講解以上字段是什么意思胧华。


首先,請(qǐng)求肯定是由客戶端這邊發(fā)起的宙彪,第一次請(qǐng)求的時(shí)候矩动,客戶端這邊的請(qǐng)求頭是沒有攜帶這些信息的,也就是說這是一個(gè)普通的請(qǐng)求释漆,如果服務(wù)器覺得當(dāng)前請(qǐng)求的資源不會(huì)怎么變動(dòng)悲没,就會(huì)在這一次請(qǐng)求中的響應(yīng)頭里添加一些信息,告訴請(qǐng)求方男图,你請(qǐng)求的這個(gè)資源可以把它緩存起來示姿,到時(shí)候你再次請(qǐng)求的時(shí)候,就不要再請(qǐng)求我了逊笆,直接拿緩存就好了(一般來說緩存的都是靜態(tài)資源如:js栈戳,css,img之類的)难裆。

那么子檀,服務(wù)器這邊會(huì)在響應(yīng)頭中添加以下字段:
cache-control: max-age=3600,我希望你把這個(gè)資源緩存起來乃戈,緩存時(shí)間是3600秒(1小時(shí))
etag: W/"121-171ca289ebf"褂痰,這個(gè)資源的編號(hào)是W/"121-171ca289ebf"
date: Thu, 30 Apr 2020 12:39:56 GMT,我給你響應(yīng)這個(gè)資源的服務(wù)器時(shí)間是格林威治時(shí)間2020-04-30 12:39:56
last-modified: Thu, 30 Apr 2020 08:16:31 GMT症虑,這個(gè)資源的上一次修改時(shí)間是格林威治時(shí)間2020-04-30 08:16:31
expires: Thu, 30 Apr 2020 12:39:56 GMT脐恩,表示過期時(shí)間點(diǎn)(這個(gè)字段是http1.0協(xié)議中的,目前已經(jīng)普遍使用的是http1.1協(xié)議侦讨,cache-control的優(yōu)先級(jí)會(huì)更高)


客戶端拿到這個(gè)響應(yīng)頭一看驶冒,就知道服務(wù)器那邊原來需要把這個(gè)資源給緩存起來苟翻,于是就按照上面的信息給緩存了起來。


接下來骗污,如果客戶端再次請(qǐng)求這個(gè)資源(當(dāng)然得是同一個(gè)地址崇猫,同一個(gè)請(qǐng)求方式),它會(huì)先檢查是否有緩存過該資源需忿,如果發(fā)現(xiàn)有緩存诅炉,則會(huì)檢查緩存是否有效,如果有效屋厘,則直接從緩存中拿取資源涕烧,根本不會(huì)去請(qǐng)求服務(wù)器。這時(shí)從network欄會(huì)看到狀態(tài)碼是200汗洒,然后size欄為disk cache或者memory cache议纯。如果說緩存失效了,那么就會(huì)向服務(wù)器發(fā)送請(qǐng)了溢谤。

但是注意瞻凤,這一次的請(qǐng)求可不是簡(jiǎn)單的請(qǐng)求,而是帶有一些特殊請(qǐng)求頭的請(qǐng)求世杀,它會(huì)在請(qǐng)求頭中添加如下字段:
if-modified-since:Thu, 30 Apr 2020 12:39:56 GMT阀参,表示上一次你給我的修改時(shí)間是這個(gè)時(shí)間
if-none-match:W/"121-171ca289ebf",表示你上一次給我的etag的值(就是該資源的編號(hào))是這個(gè)編號(hào)
接下來就看服務(wù)器怎么處理了瞻坝,服務(wù)器拿到請(qǐng)求頭一看蛛壳,然后會(huì)去拿到這些值去對(duì)比,如果發(fā)現(xiàn)不一樣所刀,則會(huì)返回最新的資源衙荐,然后返回狀態(tài)碼200,其他那些字段也會(huì)跟第一次請(qǐng)求一樣勉痴,把相應(yīng)的值返回赫模。那如果發(fā)現(xiàn)資源還是沒有變,則會(huì)返回狀態(tài)碼304蒸矛,其他字段也是一樣瀑罗,把相應(yīng)的值返回。


這下又來到了客戶端這邊雏掠,客戶端則根據(jù)狀態(tài)碼來看是否需要繼續(xù)從緩存中拿取資源斩祭,304則繼續(xù)拿到緩存的資源,然后把服務(wù)器給的那些字段都相應(yīng)的更新一遍乡话;如果是200的話摧玫,則拿到服務(wù)器給的最新的資源又緩存起來,還有那些字段也都相應(yīng)更新一遍。

以上就是http的這么一個(gè)大概的緩存機(jī)制诬像,下面我會(huì)補(bǔ)充一些細(xì)節(jié)

細(xì)節(jié)

  1. 可以看到屋群,在請(qǐng)求頭中,我還有兩個(gè)字段沒有提到坏挠,分別是cache-control 和 pragma芍躏,這兩個(gè)如果放在請(qǐng)求頭中,則表示告訴服務(wù)器降狠,不要考慮任何緩存对竣,給我一個(gè)正常的結(jié)果。傳遞形式為:
    cache-control:no-cache
    pragma:no-cache
    兩者的區(qū)別就是上面的字段為http1.1協(xié)議的榜配,下面的字段為http1.0協(xié)議的否纬。
    是的,cache-control可以出現(xiàn)在請(qǐng)求頭中
  2. 我們可以發(fā)現(xiàn)蛋褥,服務(wù)器返回的last-modified 和客戶端相應(yīng)的 if-modified-since,
    還有服務(wù)器返回的etag 和客戶端相應(yīng)的 if-none-match兩兩是一對(duì)临燃,后者的值就是前者的值。
    注:etag / if-none-match優(yōu)先級(jí)高于last-modified / if-modified-since壁拉,同時(shí)存在則只有etag / if-none-match生效谬俄。
  3. 服務(wù)器返回的cache-control字段柏靶,其實(shí)不只是max-age=xxx弃理,這一個(gè)值,還可以有下面一個(gè)或多個(gè)值:
    public: 所有內(nèi)容都將被緩存(客戶端和代理服務(wù)器都可緩存)
    private: 所有內(nèi)容只有客戶端可以緩存屎蜓,cache-control的默認(rèn)取值
    no-cache: 告知客戶端痘昌,你可以緩存這個(gè)資源,但是不要直接使用它炬转。當(dāng)你緩存之后辆苔,后續(xù)的每一次請(qǐng)求都需要附帶緩存指令,讓服務(wù)器告訴你這個(gè)資源有沒有過期扼劈。
    no-store: 告知客戶端驻啤,不要對(duì)這個(gè)資源做任何的緩存,之后的每一次請(qǐng)求都按照正常的普通請(qǐng)求進(jìn)行荐吵。若設(shè)置了這個(gè)值骑冗,瀏覽器將不會(huì)對(duì)該資源做出任何的緩存處理。
  4. 所謂的強(qiáng)緩存先煎,就是說緩存還沒過期贼涩,直接從客戶端緩存中拿就行了,根本就沒有請(qǐng)求到服務(wù)器薯蝎,而協(xié)商緩存就是客戶端緩存過期了遥倦,帶著那兩個(gè)字段給服務(wù)器,由服務(wù)器根據(jù)這兩個(gè)字段來決定是否需要繼續(xù)使用緩存的資源占锯。


    流程圖.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末袒哥,一起剝皮案震驚了整個(gè)濱河市缩筛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堡称,老刑警劉巖歪脏,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異粮呢,居然都是意外死亡婿失,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門啄寡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豪硅,“玉大人,你說我怎么就攤上這事挺物±粮。” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵识藤,是天一觀的道長(zhǎng)砚著。 經(jīng)常有香客問我,道長(zhǎng)痴昧,這世上最難降的妖魔是什么稽穆? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮赶撰,結(jié)果婚禮上舌镶,老公的妹妹穿的比我還像新娘。我一直安慰自己豪娜,他們只是感情好餐胀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘤载,像睡著了一般否灾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸣奔,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天墨技,我揣著相機(jī)與錄音,去河邊找鬼溃蔫。 笑死健提,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伟叛。 我是一名探鬼主播私痹,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了紊遵?” 一聲冷哼從身側(cè)響起账千,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎暗膜,沒想到半個(gè)月后匀奏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡学搜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年娃善,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瑞佩。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聚磺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炬丸,到底是詐尸還是另有隱情瘫寝,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布稠炬,位于F島的核電站焕阿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏首启。R本人自食惡果不足惜暮屡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闽坡。 院中可真熱鬧栽惶,春花似錦愁溜、人聲如沸疾嗅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽代承。三九已至,卻和暖如春渐扮,著一層夾襖步出監(jiān)牢的瞬間论悴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工墓律, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膀估,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓耻讽,卻偏偏與公主長(zhǎng)得像察纯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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