HTTP緩存

寫在前面

電面被問到這個問題样眠,當(dāng)時就懵了割笙,之后仔細(xì)看了下這個緩存策略权烧,HTTP博大精深啊眯亦,小弟不才望,多多指正般码。
HTTP定義了與服務(wù)器交互的方式妻率,其中最基本的有四種:GET,POST,PUT,DELETE可以說是對應(yīng)著查、改板祝、增宫静、刪。

1券时、GET /url/xxx 查看
2孤里、POST /url 創(chuàng)建
3、PUT /url/xxx 更新
4革为、DELETE /url/xxx 刪除

一個完整頁面顯示過程-HTTP工作流程

1.當(dāng)一個瀏覽器輸入URL向服務(wù)器發(fā)送一個Request實際是為了得到這個URL的html扭粱,之后在本地會收到一個Response.
2瀏覽器接收到Response分析得到html,發(fā)現(xiàn)其中有很多圖片還有文件震檩。
3.瀏覽器繼續(xù)發(fā)送Request從而獲取圖片琢蛤,CSS,JS文件抛虏。
4.獲取成功在瀏覽器將網(wǎng)頁顯示出來

GET和POST區(qū)別

1.參數(shù):GET參數(shù)是直接放到URL上面博其,通過'?'和'&'鏈接參數(shù)。POST是將參數(shù)放到了body體中進(jìn)行數(shù)據(jù)傳輸迂猴。這又證明了兩點:一慕淡、GET請求沒有body二、相對來說POST安全一些沸毁,只是針對用戶而言峰髓。但是兩者實際上都是不安全的,參數(shù)不加密的話隨便的抓包軟件都能輕松搞定息尺。
2.數(shù)據(jù)量:GET有大小限制携兵,傳統(tǒng)IE中URL的最大可用長度為2048字節(jié),其他瀏覽器對URL長度限制實現(xiàn)上有所不同搂誉。POST請求沒有限制徐紧。
3.GET使用Request.QueryString來取得變量的值。POST方式通過Request.Form來獲取變量的值炭懊。(這個我不是很理解并级,望小伙伴給講解)。

步入正題

HTTP緩存侮腹,明確的要知道GET請求可以被緩存嘲碧,POST不能被緩存,所以要想在客戶端做HTTP的緩存一定要注意使用GET請求凯旋!
頭域的概念:一圖勝千言下圖中的右邊欄加粗字體都是頭域:
Cache,Client,Entity,Transport等等

fiddler-get.png

再看左欄的Result也就是狀態(tài)碼:可以看到我這是304:這代碼當(dāng)前頁面在本地的緩存沒有過期和服務(wù)器一致呀潭,可以使用钉迷!那這是怎么做到的呢?有下面兩種方式钠署。

If-Modified-Since/Last-Modified

If-Modified-Since這個是在Request里面的Cache中的信息用來表示本地緩存最后一次被修改的時間糠聪,他被發(fā)送到服務(wù)器并且和Response的Entity中Last-Modified作比較,如果兩者的日期一致谐鼎,那就說明在此期間頁面沒有任何改動瀏覽器可以使用本地緩存舰蟆。(所提到的頭域都可以在上面圖中找到,大家結(jié)合圖來看比較清晰)

If-None-Match/Etag

If-None-Match是在Request中請求頭的第一行狸棍,他存儲一個字符串(資源在服務(wù)器的唯一確定標(biāo)志)身害。Etag是Response中Entity中的一個字符串。兩個也是做比較草戈,相同說明可以使用緩存塌鸯。

http協(xié)商緩存中:Etag/lastModified完整過程(可以配合上面的HTTP流程理解):
1.客戶端請求一個頁面(A)。
2.服務(wù)器返回頁面A唐片,并在給A加上一個Last-Modified/ETag丙猬。
3.客戶端展現(xiàn)該頁面,并將頁面連同Last-Modified/ETag一起緩存费韭。
4.客戶再次請求頁面A茧球,并將上次請求時服務(wù)器返回的Last-Modified/ETag一起傳遞給服務(wù)器。
5.服務(wù)器檢查該Last-Modified或ETag星持,并判斷出該頁面自上次客戶端請求之后還未被修改抢埋,直接返回響應(yīng)304和一個空的響應(yīng)體。

那么問題來了為什么要使用兩種緩緩存方式呢督暂?而且從我的截圖中可以看到僅有第二種Etag方式

原因如下:
1.如果一些資源定期生成揪垄,這種情況下內(nèi)容沒有變化但是服務(wù)器的 Last-Modified改變了,導(dǎo)致文件使用不了緩存逻翁。
2.Last-Modified的日期只能精確到秒從上面截圖可以看到福侈,如果在1s內(nèi)做了修改,那么就會出現(xiàn)誤判
3.由于If-Modified-Since/Last-Modified這種方式使用時間判斷一定要保證服務(wù)器和本地的時間的一致卢未。

Etag是資源在服務(wù)器的唯一標(biāo)識符,能夠更加準(zhǔn)確的控制緩存堰汉。Last-Modified 與 ETag 是可以一起使用的辽社,但是服務(wù)器會優(yōu)先驗證 ETag,在一致之后才會判斷Last-Modified翘鸭,判斷是否返回304.
修正:當(dāng)兩者同時存在的時候,通過以下表達(dá)式來進(jìn)行緩存策略的判斷.感謝@我在睡覺

if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient
   GetFromServer
else
   GetFromCache

參考: StackOverflow-the ETag or Last-Modified HTTP header?
使用Ctrl+F5 強制刷新頁面滴铅,可以忽略以上講的兩種緩存策略

操作 Cache-Control Last-Modified/Etag
前進(jìn)后退 有效 有效
刷新-F5 無效 有效
強制刷新 無效 無效

緩存過期時間

Expires:到期時間。作用: 瀏覽器會在指定過期時間內(nèi)使用本地緩存
你可以設(shè)置這個時間為Sun, 17-Jan-2038 19:14:07 GMT就乓,因為這個時間是32位unix支持的最大的時間值汉匙,就可以做到緩存的東西一直有效拱烁。
如果將這個值設(shè)置成-1那么緩存將會立即失效。
如果沒有設(shè)置Expires
對于firefox失效時間=0.1*(Time-Last-Modified )噩翠,上一次時間的0.1的時間后失效戏自。這樣設(shè)計很有道理月九沒修改越久的保存效果。如果10沒有修改1天后就會失效伤锚。

總之擅笔,不同的瀏覽器會有不同的清空緩存方法,大家有興趣可以看一下屯援。

Cache-Control

通過指定頭域Cache-Control猛们,就能實現(xiàn)控制緩存的工作機制。
指令的參數(shù)是可選的狞洋,多個指令之前可以通過‘弯淘,’來實現(xiàn)。請求響應(yīng)時使用吉懊。
緩存請求指令

指令 參數(shù) 說明
no-cache 強制向源服務(wù)器在次驗證
no-store 不緩存請求或響應(yīng)任何內(nèi)容
only-if-cached 從緩沖獲取資源
cache-extension - 新指令標(biāo)記

緩存響應(yīng)指令

指令 參數(shù) 說明
public 可以向任意方提供相應(yīng)的緩存
private 可省略 向指定用戶返回響應(yīng)
no-cache 可省略 緩存前必須確認(rèn)其有效性
cache-extension - 新指令標(biāo)記

在緩存請求中使用no-cache指令的目的是為了防止從緩存中返回過期的資源庐橙。
客戶端發(fā)送的請求中如果包含no-cache指令,則表示客戶端將不會接收緩存過的響應(yīng)惕它。于是怕午,中間的緩存服務(wù)器必須把客戶端請求轉(zhuǎn)發(fā)給源服務(wù)器。

如果服務(wù)器返回的響應(yīng)中包含no-cache指令淹魄,那么緩存服務(wù)器不能對資源進(jìn)行緩存郁惜。源服務(wù)器以后也將不再對緩存服務(wù)器請求中提出的資源進(jìn)行有效確認(rèn),禁止其對響應(yīng)資源進(jìn)行緩存操作甲锡。

一般的參數(shù)會采用no-cache這個指令表示避免使用過期緩存兆蕉。而no-store表示真正完全不使用緩存
only-if-cached只從緩存服務(wù)器本地中換取緩存。只要緩存服務(wù)器無法加載響應(yīng)缤沦,就會返回錯誤狀態(tài)碼504Gateway Timeout虎韵。

使用

在iOS上優(yōu)雅的使用etag緩存
TeamWe github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缸废,隨后出現(xiàn)的幾起案子包蓝,更是在濱河造成了極大的恐慌,老刑警劉巖企量,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件测萎,死亡現(xiàn)場離奇詭異,居然都是意外死亡届巩,警方通過查閱死者的電腦和手機硅瞧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恕汇,“玉大人腕唧,你說我怎么就攤上這事或辖。” “怎么了枣接?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵颂暇,是天一觀的道長。 經(jīng)常有香客問我月腋,道長蟀架,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任榆骚,我火速辦了婚禮片拍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妓肢。我一直安慰自己捌省,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布碉钠。 她就那樣靜靜地躺著纲缓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喊废。 梳的紋絲不亂的頭發(fā)上祝高,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音污筷,去河邊找鬼工闺。 笑死,一個胖子當(dāng)著我的面吹牛瓣蛀,可吹牛的內(nèi)容都是我干的陆蟆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惋增,長吁一口氣:“原來是場噩夢啊……” “哼叠殷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诈皿,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤林束,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后稽亏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诊县,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年措左,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片避除。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡怎披,死狀恐怖胸嘁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凉逛,我是刑警寧澤性宏,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站状飞,受9級特大地震影響毫胜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诬辈,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一酵使、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧焙糟,春花似錦口渔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悦穿,卻和暖如春攻礼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背栗柒。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工礁扮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人傍衡。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓深员,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛙埂。 傳聞我的和親對象是個殘疾皇子倦畅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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

  • 本文內(nèi)容大多參考《圖解HTTP》一書 一. 認(rèn)識代理服務(wù)器 所以講緩存為什么要先扯代理服務(wù)器?別急绣的,讓我們看一下一...
    流光號船長閱讀 1,921評論 0 10
  • 網(wǎng)絡(luò)特有的延遲以及數(shù)據(jù)傳輸?shù)某杀镜停萍s互聯(lián)網(wǎng)快速獲取Web資源。為此屡江,HTTP協(xié)議引入緩存以空間換時間芭概,使瀏覽器緩...
    大頭8086閱讀 3,066評論 2 12
  • 1. 緩存的分類 緩存分為服務(wù)端緩存和客戶端緩存 服務(wù)端緩存又分為代理服務(wù)器緩存和反向代理服務(wù)器緩存(也叫網(wǎng)關(guān)緩存...
    lemonCode閱讀 346評論 0 0
  • 時間:2016-12-12 17:51:30作者: zhongxia 零、前言 這里主要寫的是理論惩嘉,具體實踐的比較...
    izhongxia閱讀 273評論 0 1
  • 作者:Ulrich Kautz 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/p...
    胡子大哈閱讀 346評論 0 2