協(xié)商緩存與強(qiáng)制緩存

1从藤、瀏覽器緩存
緩存這東西劳坑,第一次必須獲取到資源后链韭,然后根據(jù)返回的信息來告訴如何緩存資源缎玫,可能采用的是強(qiáng)緩存,也可能告訴客戶端瀏覽器是協(xié)商緩存膳灶,這都需要根據(jù)響應(yīng)的header內(nèi)容來決定的咱士。下面用兩幅圖來描述瀏覽器的緩存是怎么玩的,讓大家有個(gè)大概的認(rèn)知轧钓。
瀏覽器第一次請(qǐng)求時(shí):



瀏覽器后續(xù)在進(jìn)行請(qǐng)求時(shí):


從上圖可以知道序厉,瀏覽器緩存包含兩種類型,即強(qiáng)緩存(也叫本地緩存)和協(xié)商緩存毕箍,瀏覽器在第一次請(qǐng)求發(fā)生后弛房,再次請(qǐng)求時(shí):

瀏覽器在請(qǐng)求某一資源時(shí),會(huì)先獲取該資源緩存的header信息而柑,判斷是否命中強(qiáng)緩存(cache-control和expires信息)文捶,若命中直接從緩存中獲取資源信息,包括緩存header信息媒咳;本次請(qǐng)求根本就不會(huì)與服務(wù)器進(jìn)行通信粹排;在firebug下可以查看某個(gè)具有強(qiáng)緩存資源返回的信息,例如本地firebug查看的一個(gè)強(qiáng)緩存js文件

如果沒有命中強(qiáng)緩存涩澡,瀏覽器會(huì)發(fā)送請(qǐng)求到服務(wù)器顽耳,請(qǐng)求會(huì)攜帶第一次請(qǐng)求返回的有關(guān)緩存的header字段信息(Last-Modified/If-Modified-Since和Etag/If-None-Match),由服務(wù)器根據(jù)請(qǐng)求中的相關(guān)header信息來比對(duì)結(jié)果是否協(xié)商緩存命中筏养;若命中斧抱,則服務(wù)器返回新的響應(yīng)header信息更新緩存中的對(duì)應(yīng)header信息,但是并不返回資源內(nèi)容渐溶,它會(huì)告知瀏覽器可以直接從緩存獲然云帧;否則返回最新的資源內(nèi)容

強(qiáng)緩存與協(xié)商緩存的區(qū)別:

強(qiáng)緩存 從緩存取 200(from cache)否茎辐,直接從緩存取

協(xié)商緩存 從緩存取 304(not modified)是宪郊,正如其名掂恕,通過服務(wù)器來告知緩存是否可用

2、?強(qiáng)緩存相關(guān)的header字段
強(qiáng)緩存上面已經(jīng)介紹了弛槐,直接從緩存中獲取資源而不經(jīng)過服務(wù)器懊亡;與強(qiáng)緩存相關(guān)的header字段有兩個(gè):
expires,這是http1.0時(shí)的規(guī)范乎串;它的值為一個(gè)絕對(duì)時(shí)間的GMT格式的時(shí)間字符串店枣,如Mon, 10 Jun 2015 21:31:12 GMT,如果發(fā)送請(qǐng)求的時(shí)間在expires之前叹誉,那么本地緩存始終有效鸯两,否則就會(huì)發(fā)送請(qǐng)求到服務(wù)器來獲取資源
cache-control:max-age=number,這是http1.1時(shí)出現(xiàn)的header信息长豁,主要是利用該字段的max-age值來進(jìn)行判斷钧唐,它是一個(gè)相對(duì)值;資源第一次的請(qǐng)求時(shí)間和Cache-Control設(shè)定的有效期匠襟,計(jì)算出一個(gè)資源過期時(shí)間钝侠,再拿這個(gè)過期時(shí)間跟當(dāng)前的請(qǐng)求時(shí)間比較,如果請(qǐng)求時(shí)間在過期時(shí)間之前酸舍,就能命中緩存帅韧,否則就不行;cache-control除了該字段外父腕,還有下面幾個(gè)比較常用的設(shè)置值:no-cache:不使用本地緩存弱匪。需要使用緩存協(xié)商青瀑,先與服務(wù)器確認(rèn)返回的響應(yīng)是否被更改璧亮,如果之前的響應(yīng)中存在ETag,那么請(qǐng)求的時(shí)候會(huì)與服務(wù)端驗(yàn)證斥难,如果資源未被更改枝嘶,則可以避免重新下載。
no-store:直接禁止游覽器緩存數(shù)據(jù)哑诊,每次用戶請(qǐng)求該資源群扶,都會(huì)向服務(wù)器發(fā)送一個(gè)請(qǐng)求,每次都會(huì)下載完整的資源镀裤。
public:可以被所有的用戶緩存竞阐,包括終端用戶和CDN等中間代理服務(wù)器。
private:只能被終端用戶的瀏覽器緩存暑劝,不允許CDN等中繼緩存服務(wù)器對(duì)其緩存骆莹。

注意:如果cache-control與expires同時(shí)存在的話,cache-control的優(yōu)先級(jí)高于expires
3担猛、?協(xié)商緩存相關(guān)的header字段
協(xié)商緩存都是由服務(wù)器來確定緩存資源是否可用的幕垦,所以客戶端與服務(wù)器端要通過某種標(biāo)識(shí)來進(jìn)行通信丢氢,從而讓服務(wù)器判斷請(qǐng)求資源是否可以緩存訪問,這主要涉及到下面兩組header字段先改,這兩組搭檔都是成對(duì)出現(xiàn)的疚察,即第一次請(qǐng)求的響應(yīng)頭帶上某個(gè)字段(Last-Modified或者Etag),則后續(xù)請(qǐng)求則會(huì)帶上對(duì)應(yīng)的請(qǐng)求字段(If-Modified-Since或者If-None-Match)仇奶,若響應(yīng)頭沒有Last-Modified或者Etag字段貌嫡,則請(qǐng)求頭也不會(huì)有對(duì)應(yīng)的字段
Last-Modified/If-Modified-Since二者的值都是GMT格式的時(shí)間字符串该溯,具體過程:瀏覽器第一次跟服務(wù)器請(qǐng)求一個(gè)資源衅枫,服務(wù)器在返回這個(gè)資源的同時(shí),在respone的header加上Last-Modified的header朗伶,這個(gè)header表示這個(gè)資源在服務(wù)器上的最后修改時(shí)間
瀏覽器再次跟服務(wù)器請(qǐng)求這個(gè)資源時(shí)弦撩,在request的header上加上If-Modified-Since的header,這個(gè)header的值就是上一次請(qǐng)求時(shí)返回的Last-Modified的值
服務(wù)器再次收到資源請(qǐng)求時(shí)论皆,根據(jù)瀏覽器傳過來If-Modified-Since和資源在服務(wù)器上的最后修改時(shí)間判斷資源是否有變化益楼,如果沒有變化則返回304 Not Modified,但是不會(huì)返回資源內(nèi)容点晴;如果有變化感凤,就正常返回資源內(nèi)容。當(dāng)服務(wù)器返回304 Not Modified的響應(yīng)時(shí)粒督,response header中不會(huì)再添加Last-Modified的header陪竿,因?yàn)榧热毁Y源沒有變化,那么Last-Modified也就不會(huì)改變屠橄,這是服務(wù)器返回304時(shí)的response header
瀏覽器收到304的響應(yīng)后族跛,就會(huì)從緩存中加載資源
如果協(xié)商緩存沒有命中,瀏覽器直接從服務(wù)器加載資源時(shí)锐墙,Last-Modified的Header在重新加載的時(shí)候會(huì)被更新礁哄,下次請(qǐng)求時(shí),If-Modified-Since會(huì)啟用上次返回的Last-Modified值

Etag/If-None-Match這兩個(gè)值是由服務(wù)器生成的每個(gè)資源的唯一標(biāo)識(shí)字符串溪北,只要資源有變化就這個(gè)值就會(huì)改變桐绒;其判斷過程與Last-Modified/If-Modified-Since類似,與Last-Modified不一樣的是之拨,當(dāng)服務(wù)器返回304 Not Modified的響應(yīng)時(shí)茉继,由于ETag重新生成過,response header中還會(huì)把這個(gè)ETag返回蚀乔,即使這個(gè)ETag跟之前的沒有變化烁竭。

4、既生Last-Modified何生Etag
  你可能會(huì)覺得使用Last-Modified已經(jīng)足以讓瀏覽器知道本地的緩存副本是否足夠新乙墙,為什么還需要Etag呢颖变?HTTP1.1中Etag的出現(xiàn)主要是為了解決幾個(gè)Last-Modified比較難解決的問題:
一些文件也許會(huì)周期性的更改生均,但是他的內(nèi)容并不改變(僅僅改變的修改時(shí)間),這個(gè)時(shí)候我們并不希望客戶端認(rèn)為這個(gè)文件被修改了腥刹,而重新GET马胧;

某些文件修改非常頻繁,比如在秒以下的時(shí)間內(nèi)進(jìn)行修改衔峰,(比方說1s內(nèi)修改了N次)佩脊,If-Modified-Since能檢查到的粒度是s級(jí)的,這種修改無法判斷(或者說UNIX記錄MTIME只能精確到秒)垫卤;

某些服務(wù)器不能精確的得到文件的最后修改時(shí)間威彰。

這時(shí),利用Etag能夠更加準(zhǔn)確的控制緩存穴肘,因?yàn)镋tag是服務(wù)器自動(dòng)生成或者由開發(fā)者生成的對(duì)應(yīng)資源在服務(wù)器端的唯一標(biāo)識(shí)符歇盼。
Last-Modified****與ETag****是可以一起使用的,服務(wù)器會(huì)優(yōu)先驗(yàn)證ETag****评抚,一致的情況下豹缀,才會(huì)繼續(xù)比對(duì)Last-Modified****,最后才決定是否返回304慨代。
5邢笙、用戶的行為對(duì)緩存的影響

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市侍匙,隨后出現(xiàn)的幾起案子氮惯,更是在濱河造成了極大的恐慌,老刑警劉巖想暗,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妇汗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡江滨,警方通過查閱死者的電腦和手機(jī)铛纬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門厌均,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唬滑,“玉大人,你說我怎么就攤上這事棺弊【埽” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵模她,是天一觀的道長(zhǎng)稻艰。 經(jīng)常有香客問我,道長(zhǎng)侈净,這世上最難降的妖魔是什么尊勿? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任僧凤,我火速辦了婚禮,結(jié)果婚禮上元扔,老公的妹妹穿的比我還像新娘躯保。我一直安慰自己,他們只是感情好澎语,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布途事。 她就那樣靜靜地躺著,像睡著了一般擅羞。 火紅的嫁衣襯著肌膚如雪尸变。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天减俏,我揣著相機(jī)與錄音召烂,去河邊找鬼。 笑死娃承,一個(gè)胖子當(dāng)著我的面吹牛骑晶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播草慧,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼桶蛔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了漫谷?” 一聲冷哼從身側(cè)響起仔雷,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舔示,沒想到半個(gè)月后碟婆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惕稻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年竖共,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俺祠。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡公给,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜘渣,到底是詐尸還是另有隱情淌铐,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布蔫缸,位于F島的核電站腿准,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拾碌。R本人自食惡果不足惜吐葱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一街望、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弟跑,春花似錦它匕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至扑浸,卻和暖如春烧给,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喝噪。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工础嫡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酝惧。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓榴鼎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親晚唇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巫财,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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