緩存Cache-Control

首先附上前面提到的一張圖:

輸入url后經(jīng)過http得到response完整過程

根據(jù)上面的這張圖,來說http協(xié)議中的緩存,也就是cache-control將會格外清晰。

Cache-Control包括哪些特性呢光绕?

第一,可緩存性:public? private? no-cache畜份〉剩可緩存性指http的response進(jìn)過的哪些地方可以進(jìn)行緩存。public指在response返回經(jīng)過的任何地方都可以緩存爆雹,包括代理服務(wù)器停蕉,客戶端等,這樣下次請求將不會到達(dá)服務(wù)端而直接返回response钙态;private則表示只有返回的瀏覽器才可以進(jìn)行緩存慧起;no-cache則表示不可直接用緩存,而是先要到服務(wù)器端進(jìn)行驗證册倒。

第二蚓挤,到期:max-age=<seconds>,代表緩存的時間(秒)驻子;s-maxage=<seconds>,專門為代理服務(wù)器設(shè)置灿意,如果與max-age同時返回,則瀏覽器會讀取max-age拴孤,而代理服務(wù)器則會讀取s-maxage這個設(shè)置脾歧;max-stale=<seconds>,代表在max-age過期后演熟,如果存在max-stale鞭执,而且其時間沒有過期司顿,則表示仍然可以用緩存,max-stale只在request發(fā)起端設(shè)置是有用的兄纺,又因為瀏覽器不會幫助我們帶上這個頭大溜,所以客戶端是瀏覽器的時候這個max-stale是用不到的。

第三估脆,重新驗證:must-revalidate和proxy-revalidate钦奋,這兩個表示緩存過期時間到達(dá)以后,必須要到服務(wù)端重新請求和重新驗證疙赠,這兩個屬性在瀏覽器也不怎么出現(xiàn)付材。

第四,其他圃阳,no-store厌衔,表示本地和代理服務(wù)器都不可以用緩存,必須去重新獲群丛馈富寿;no-transform,告訴代理服務(wù)器不要對返回的body進(jìn)行處理锣夹,比如壓縮等(代理服務(wù)器比如nginx等可以不遵守页徐,但是這個是規(guī)范,最好遵守)银萍。

下面附上做的幾個簡單的例子來加深對上面的理解变勇。例子中通過查看對文件script.js的緩存情況說明問題。

test.html
server.js

執(zhí)行node server.js砖顷,觀察瀏覽器network如下圖(這里注意贰锁,瀏覽器的Disable cache沒有勾選赃梧,否則會默認(rèn)忽略Cache-Control的設(shè)置):

立刻重新刷新瀏覽器滤蝠,則network中出現(xiàn)下圖:

此時我們可以看見這事size一欄是from memory cache,因為我們設(shè)置max-age為20s授嘀,在這個期間即使我改變script.js的內(nèi)容物咳,瀏覽器仍然會用memory里面的內(nèi)容,而得不到更新蹄皱。很顯然實際開發(fā)中览闰,如果出現(xiàn)這樣的問題,是很可怕的巷折。同時如果每次去后端請求response压鉴,又會使網(wǎng)頁很慢,實際中max-age往往要設(shè)置很大锻拘,表示在本地保存很久的時間油吭,那么下次請求的Time為0击蹲。那么實際開發(fā)中,如何去解決這兩者的矛盾呢婉宰?就是通過改變url的方法歌豺,在請求的文件名后面加上根據(jù)內(nèi)容生成的哈希值(刷新瀏覽器緩存的方案),這樣實際請求的url將會改變心包,那么自然就會去重新請求类咧,如果后端的文件沒有更新,也就是url沒有變蟹腾,則自然會在緩存中讀取痕惋,則不需要經(jīng)過網(wǎng)絡(luò)傳輸,則速度是很快的娃殖,用戶體驗是很好的血巍。network一欄中,這里Size的兩個值珊随,上面表示傳輸時候的大小述寡,下面表示實際的大小(上面的可進(jìn)行壓縮Gzip傳輸叶洞,但是不曉得header可不可以壓縮鲫凶,貌似http2中支持頭壓縮),傳輸時的大小比實際的大衩辟,因為加上了頭信息螟炫。Time的兩個值,上面一行表示從請求開始到接受完最后一個byte為止的時間艺晴。下面一行是Latency昼钻,代表從請求接受完到讀取該資源第一個byte之間的等待時間。

緩存流程圖

上圖是查找緩存的過程封寞。

如果Cache-Control中max-age的值設(shè)置很大然评,那么一直用本地的緩存肯定是不可取的。所以除了給文件名后面加上哈希碼之外的方法狈究,我們可以通過每次去后端詢問是否文件有所改動碗淌?那么如何來實現(xiàn)這個過程呢?首先在Cache-Control中設(shè)置no-cache抖锥,同時遵從實際情況我們把max-age設(shè)置很大亿眠。更改servr.js如下:

server.js

打開network,多次刷新仍然如下:

說明此時已經(jīng)不在緩存中讀取了磅废,即使我們的max-age設(shè)置很大纳像,這是因為我們設(shè)置了no-cache。所以每次我們都不會直接使用緩存了拯勉。那么如何發(fā)揮no-cache的作用呢竟趾,還需要配合資源驗證耙考,資源驗證在http中主要有兩個頭:Last-Modified和Etag。這個內(nèi)容介紹在-資源驗證Last-Modified和Etag中介紹潭兽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倦始,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子山卦,更是在濱河造成了極大的恐慌鞋邑,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件账蓉,死亡現(xiàn)場離奇詭異枚碗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铸本,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門肮雨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人箱玷,你說我怎么就攤上這事怨规。” “怎么了锡足?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵波丰,是天一觀的道長。 經(jīng)常有香客問我舶得,道長掰烟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任沐批,我火速辦了婚禮纫骑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘九孩。我一直安慰自己先馆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布捻撑。 她就那樣靜靜地躺著磨隘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顾患。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天个唧,我揣著相機(jī)與錄音江解,去河邊找鬼。 笑死徙歼,一個胖子當(dāng)著我的面吹牛犁河,可吹牛的內(nèi)容都是我干的鳖枕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼桨螺,長吁一口氣:“原來是場噩夢啊……” “哼宾符!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起灭翔,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤魏烫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肝箱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哄褒,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年煌张,在試婚紗的時候發(fā)現(xiàn)自己被綠了呐赡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡骏融,死狀恐怖链嘀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情档玻,我是刑警寧澤管闷,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站窃肠,受9級特大地震影響包个,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冤留,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一碧囊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纤怒,春花似錦糯而、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烘豹,卻和暖如春瓜贾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背携悯。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工祭芦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人憔鬼。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓龟劲,卻偏偏與公主長得像胃夏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昌跌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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