站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        你值得了解的HTTP緩存機(jī)制(代碼詳解)

        之前的文章《深入解析vue中路由切換白屏的問題(附代碼)》中,給大家了解了vue中路由切換白屏的問題。下面本篇文章給大家了解HTTP緩存機(jī)制詳解,有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對你們有所助。

        你值得了解的HTTP緩存機(jī)制(代碼詳解)

        Web緩存大致可以分為:數(shù)據(jù)庫緩存、服務(wù)器端緩存(代理服務(wù)器緩存、CDN緩存)、瀏覽器緩存。

        瀏覽器緩存也包含很多內(nèi)容:HTTP緩存、indexDBcookie、localstorage等等。 這里要說的是http緩存。

        使用緩存的好處

        • 減少了冗余的數(shù)據(jù)傳輸

        • 緩解了網(wǎng)絡(luò)瓶頸的問題

        • 降低了對原始服務(wù)器的要求

        • 降低了距離時(shí)延

        術(shù)語

        緩存命中率:從緩存中得到數(shù)據(jù)的請求數(shù)與所有請求數(shù)的比率。理想狀態(tài)是越高越好。

        過期內(nèi)容:超過設(shè)置的有效時(shí)間,被標(biāo)記為“陳舊”的內(nèi)容。通常過期內(nèi)容不能用于回復(fù)客戶端的請求,必須重新向源服務(wù)器請求新的內(nèi)容或者驗(yàn)證緩存的內(nèi)容是否仍然準(zhǔn)備。

        驗(yàn)證:驗(yàn)證緩存中的過期內(nèi)容是否仍然有效,驗(yàn)證通過的話刷新過期時(shí)間。

        失效:失效就是把內(nèi)容從緩存中移除。當(dāng)內(nèi)容發(fā)生改變時(shí)就必須移除失效的內(nèi)容。

        機(jī)制

        你值得了解的HTTP緩存機(jī)制(代碼詳解)

        策略

        1)緩存存儲策略

        緩存存儲策略決定了客戶端是否應(yīng)該存儲httpresponse。與緩存存儲有關(guān)的http header主要為response header中的Cache-Control。該header有下面幾個對應(yīng)的值:Public、Private、no-cache、max-age、no-store。除了no-store,其它幾種都會表明response應(yīng)該被客戶端緩存。

        指令 說明
        Public 所有內(nèi)容都將被緩存(客戶端和代理服務(wù)器都可緩存)
        Private 內(nèi)容只緩存到私有緩存中(僅客戶端可以緩存,代理服務(wù)器不可緩存)
        max-age = xxx (xxx is numeric) 緩存的內(nèi)容將在 xxx 秒后失效,失效前可以直接使用本地緩存,失效后必須向服務(wù)器確認(rèn)資源是否已經(jīng)改變。
        no-store 完全不在客戶端緩存
        no-cache 可以認(rèn)為等同于 max-age=0 的情況,即將 response 緩存在客戶端,但是之后每次都向服務(wù)器確認(rèn)資源是否已經(jīng)改變

        通過Cache-Control:Public設(shè)置我們可以將HTTP響應(yīng)數(shù)據(jù)存儲到本地,但此時(shí)并不意味著后續(xù)瀏覽器會直接從緩存中讀取數(shù)據(jù)并使用, 因?yàn)樗鼰o法確定本地緩存的數(shù)據(jù)是否可用(可能已經(jīng)失效),需通過緩存過期策略來判斷

        2)緩存過期策略

        緩存過期策略決定了客戶端存儲在本地的緩存數(shù)據(jù)是否已過期,如未過期則可以直接使用本地存儲的數(shù)據(jù),否則就需要發(fā)請求到服務(wù)端嘗試重新獲取數(shù)據(jù)。 與緩存過期策略有關(guān)的http header 為Expires

        Expires表示緩存數(shù)據(jù)有效的絕對時(shí)間,告訴客戶端到了這個時(shí)間點(diǎn)后本地緩存就失效了,在這個時(shí)間內(nèi)客戶端可以不請求服務(wù)器而直接從本地緩存中使用已存儲的結(jié)果。

        需要注意的是:no-cache和max-age=xxx的優(yōu)先級高于Expires,當(dāng)它們同時(shí)存在的時(shí)候,后者會被覆蓋掉。其次, 緩存數(shù)據(jù)過期只是告訴客戶端不能再直接從本地讀取緩存了,而是需要再發(fā)一次請求到服務(wù)器去確認(rèn)。具體什么情況下本地存儲的數(shù)據(jù)還可以繼續(xù)使用就與緩存對比策略有關(guān)了。

        3)緩存對比策略

        將緩存在客戶端的數(shù)據(jù)標(biāo)識發(fā)往服務(wù)端,服務(wù)端通過標(biāo)識來判斷客戶端緩存數(shù)據(jù)是否仍有效,進(jìn)而決定是否要重發(fā)數(shù)據(jù)。客戶端檢測到數(shù)據(jù)過期或?yàn)g覽器刷新后,會重新發(fā)起一個 http 請求到服務(wù)器,服務(wù)器此時(shí)并不急于返回?cái)?shù)據(jù),而是看請求頭有沒有帶標(biāo)識(If-Modified-Since、If-None-Match)過來,如果判斷標(biāo)識仍然有效,則返回304告訴客戶端取本地緩存數(shù)據(jù)來用即可(這里要注意的是你必須要在首次響應(yīng)時(shí)輸出相應(yīng)的頭信息(Last-Modified、ETags)到客戶端)。 本地緩存數(shù)據(jù)即使被認(rèn)為過期,并不等于數(shù)據(jù)從此就沒用了。

        緩存過期取值

        存儲策略里面no-cache等同于max-age=0,假如服務(wù)端返回的響應(yīng)中沒有指明max-age、no-cacheExpires時(shí),客戶端是否會緩存 http response呢 ?通過FiddlerCharles等抓包工具可以發(fā)現(xiàn),客戶端一樣會進(jìn)行緩存

        其取值值為響應(yīng)頭中的DateLast-Modified之間的差值的10%作為緩存有效時(shí)間

        FiddlerCaching面板中可以看到

        HTTP/1.1 Cache-Control Header is present: private HTTP Last-Modified Header is present: Tue, 08 Nov 2016 06:59:00 GMT No explicit HTTP Cache Lifetime information was provided. Heuristic expiration policies suggest defaulting to: 10% of the delta between Last-Modified and Date. That's '05:15:02' so this response will heuristically expire 2016/11/11 0:46:01.

        用一副圖來表示

        你值得了解的HTTP緩存機(jī)制(代碼詳解)

        緩存的控制

        1)強(qiáng)制緩存

        可以通過Expires,Cache-Control來設(shè)定,Expires指緩存過期的時(shí)間,超過了這個時(shí)間點(diǎn)就代表資源過期。有一個問題是由于使用具體時(shí)間,如果時(shí)間表示出錯或者沒有轉(zhuǎn)換到正確的時(shí)區(qū)都可能造成緩存生命周期出錯。 并且ExpiresHTTP/1.0的標(biāo)準(zhǔn),現(xiàn)在更傾向于用HTTP/1.1中定義的Cache-Control。兩個同時(shí)存在時(shí)也是Cache-Control的優(yōu)先級更高。

        2)協(xié)商緩存

        緩存的資源到期了,并不意味著資源內(nèi)容發(fā)生了改變,如果和服務(wù)器上的資源沒有差異,實(shí)際上沒有必要再次請求??蛻舳撕头?wù)器端通過某種驗(yàn)證機(jī)制驗(yàn)證當(dāng)前請求資源是否可以使用緩存。 瀏覽器第一次請求數(shù)據(jù)之后會將數(shù)據(jù)和響應(yīng)頭部的緩存標(biāo)識存儲起來。再次請求時(shí)會帶上存儲的頭部字段,服務(wù)器端驗(yàn)證是否可用。如果返回304 Not Modified,代表資源沒有發(fā)生改變可以使用緩存的數(shù)據(jù),獲取新的過期時(shí)間。反之返回200就相當(dāng)于重新請求了一遍資源并替換舊資源。

        Last-modified/If-Modified-Since

        Last-modified: 服務(wù)器端資源的最后修改時(shí)間,響應(yīng)頭部會帶上這個標(biāo)識。第一次請求之后,瀏覽器記錄這個時(shí)間,再次請求時(shí),請求頭部帶上If-Modified-Since即為之前記錄下的時(shí)間。服務(wù)器端收到帶If-Modified-Since的請求后會去和資源的最后修改時(shí)間對比。若修改過就返回最新資源,狀態(tài)碼200,若沒有修改過則返回304。

        你值得了解的HTTP緩存機(jī)制(代碼詳解)

        Etag/If-None-Match

        由服務(wù)器端上生成的一段hash字符串,第一次請求時(shí)響應(yīng)頭帶上ETag: abcd,之后的請求中帶上If-None-Match: abcd,服務(wù)器檢查ETag,返回304200。

        關(guān)于 last-modified 和 Etag 區(qū)別

        • 某些服務(wù)器不能精確得到資源的最后修改時(shí)間,這樣就無法通過最后修改時(shí)間判斷資源是否更新。

        • Last-modified只能精確到秒。

        • 一些資源的最后修改時(shí)間改變了,但是內(nèi)容沒改變,使用Last-modified看不出內(nèi)容沒有改變。

        • Etag的精度比Last-modified高,屬于強(qiáng)驗(yàn)證,要求資源字節(jié)級別的一致,優(yōu)先級高。如果服務(wù)器端有提供ETag的話,必須先對ETag進(jìn)行Conditional Request。

        注意:實(shí)際使用ETag/Last-modified要注意保持一致性,做負(fù)載均衡和反向代理的話可能會出現(xiàn)不一致的情況。計(jì)算ETag也是需要占用資源的,如果修改不是過于頻繁,看自己的需求用Cache-Control是否可以滿足。

        實(shí)際應(yīng)用

        首先要明確哪些內(nèi)容適合被緩存哪些不適合。

        考慮緩存的內(nèi)容:css樣式文件,js文件,logo、圖標(biāo),html文件,可以下載的內(nèi)容一些不應(yīng)該被緩存的內(nèi)容:業(yè)務(wù)敏感的GET請求

        可緩存的內(nèi)容又分為幾種不同的情況:

        不經(jīng)常改變的文件:給max-age設(shè)置一個較大的值,一般設(shè)置max-age=31536000比如引入的一些第三方文件、打包出來的帶有hash后綴cssjs文件。一般來說文件內(nèi)容改變了,會更新版本號、hash值,相當(dāng)于請求另一個文件。 標(biāo)準(zhǔn)中規(guī)定max-age的值最大不超過一年,所以設(shè)成max-age=31536000。至于過期內(nèi)容,緩存區(qū)會將一段時(shí)間沒有使用的文件刪除掉。

        [完]

        推薦學(xué)習(xí):Html5視頻教程

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 中文成人无字幕乱码精品区| 久久99国产精品二区不卡| 国语自产精品视频在线区| 国产精品网址在线观看你懂的| 久久99国产精品尤物| 久久99精品久久久久久水蜜桃| 好吊妞视频精品| 午夜精品射精入后重之免费观看 | 无码精品人妻一区二区三区免费看| 国产成人精品一区二三区在线观看| 国产成人精品日本亚洲11| 国内精品久久久人妻中文字幕| 自拍偷自拍亚洲精品情侣| 免费精品久久久久久中文字幕| 国产在线91精品入口| 国产精品无码不卡一区二区三区| 柠檬福利精品视频导航| 国产精品久久波多野结衣| 精品深夜AV无码一区二区| 无码人妻精品一区二区三区99仓本 | 欧洲精品一区二区三区在线观看 | 亚洲无码日韩精品第一页| 欧美日韩精品系列一区二区三区国产一区二区精品| 亚洲国产成人精品不卡青青草原 | 欧美精品高清在线xxxx| 韩国三级中文字幕hd久久精品| 国产成人精品日本亚洲专区| 99久久www免费人成精品| 四虎国产精品永久一区| 九九热精品在线| 免费欧美精品a在线| 亚洲精品人成在线观看| 亚洲精品欧美综合| 国产A∨国片精品一区二区| 成人精品视频成人影院| 国产精品 一区 在线| 国产午夜精品理论片免费观看| 国产精品 视频一区 二区三区| 国产精品v欧美精品v日本精| 精品国产人成亚洲区| 久久精品国产一区二区|