摘要:設(shè)置緩存目前比較常見的緩存機(jī)制包括以下幾種都是設(shè)置要配合使用。讀取緩存數(shù)據(jù)條件上次緩存時(shí)間客戶端的當(dāng)前時(shí)間客戶端的值可以是各個(gè)消息中的指令含義如下指示響應(yīng)可被任何緩存區(qū)緩存。協(xié)議規(guī)格說明定義為被請(qǐng)求變量的實(shí)體值參見章節(jié)。
web瀏覽器緩存
沒有緩存的世界,每次請(qǐng)求都是嚴(yán)格意義上的新的請(qǐng)求,那么服務(wù)器端的壓力可想而知,客戶端的響應(yīng)速度也是大打折扣,就是我們?cè)趯懗绦蛞仓佬枰彺?,把一些常用的?shù)據(jù)緩存區(qū)來,避免每次都要重新讀取,特別是前端在進(jìn)行元素獲取時(shí),雖然鏈?zhǔn)秸{(diào)用讓我們很舒服,但是如果每次都需要重新獲取這個(gè)元素的話,最好還是使用變量緩存起來比較好。
設(shè)置緩存目前比較常見的緩存機(jī)制包括以下幾種[都是設(shè)置http header]:
Expires
Cache-Control
Last-Modified/If-Modified-Since:Last-Modified/If-Modified-Since要配合Cache-Control使用。
Etag/If-None-Match:Etag/If-None-Match也要配合Cache-Control使用
一個(gè)實(shí)際資源訪問的響應(yīng)頭部部分信息如下:
cache-control:max-age=691200 content-encoding:gzip content-type:application/javascript date:Sat, 05 Aug 2017 13:27:45 GMT etag:W/"59845e75-2cfb5" expires:Sat, 12 Aug 2017 11:47:47 GMT last-modified:Fri, 04 Aug 2017 11:45:57 GMTExpires
Expires是http1.0提出的一個(gè)表示資源過期時(shí)間的header,它描述的是一個(gè)絕對(duì)時(shí)間,由服務(wù)器返回,用GMT格式的字符串表示,如:Expires:Thu, 31 Dec 2016 23:55:55 GMT,
new Date() Sat Aug 05 2017 21:39:11 GMT+0800 (CST) //東八區(qū),使用toUTCString轉(zhuǎn)換為GMT格式 new Date().toUTCString() "Sat, 05 Aug 2017 13:43:39 GMT" //格林威治時(shí)區(qū) 0
這個(gè)時(shí)候,發(fā)現(xiàn)有個(gè)問題,因?yàn)闀r(shí)間是服務(wù)端返回的,也就是說前端其實(shí)很少自己來設(shè)置緩存頭部的,node作為后端時(shí)例外,問題是如果前后端存在時(shí)差,或者時(shí)間不一致的時(shí)候,只能抓瞎了,誤差會(huì)比較大,這個(gè)時(shí)候第二種方案出來了;
Cache-ControlCache-Control描述的是一個(gè)相對(duì)時(shí)間,在進(jìn)行緩存命中的時(shí)候,都是利用客戶端時(shí)間進(jìn)行判斷,所以相比較Expires,Cache-Control的緩存管理更有效,安全一些。
讀取緩存數(shù)據(jù)條件:上次緩存時(shí)間(客戶端的)+max-age < 當(dāng)前時(shí)間(客戶端的)
Cache-Control值可以是public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age
各個(gè)消息中的指令含義如下: Public指示響應(yīng)可被任何緩存區(qū)緩存。 Private指示對(duì)于單個(gè)用戶的整個(gè)或部分響應(yīng)消息,不能被共享緩存處理。這允許服務(wù)器僅僅描述當(dāng)前用戶的部分響應(yīng)消息,此響應(yīng)消息對(duì)于其他用戶的請(qǐng)求無效。 no-cache指示請(qǐng)求或響應(yīng)消息不能緩存,該選項(xiàng)并不是說可以設(shè)置”不緩存“,而是需要和服務(wù)器確認(rèn) no-store在請(qǐng)求消息中發(fā)送將使得請(qǐng)求和響應(yīng)消息都不使用緩存,完全不存下來。 max-age指示客戶機(jī)可以接收生存期不大于指定時(shí)間(以秒為單位)的響應(yīng)。上次緩存時(shí)間(客戶端的)+max-age(64200s)<客戶端當(dāng)前時(shí)間 min-fresh指示客戶機(jī)可以接收響應(yīng)時(shí)間小于當(dāng)前時(shí)間加上指定時(shí)間的響應(yīng)。 max-stale指示客戶機(jī)可以接收超出超時(shí)期間的響應(yīng)消息。如果指定max-stale消息的值,那么客戶機(jī)可以接收超出超時(shí)期指定值之內(nèi)的響應(yīng)消息。
注意:這兩個(gè)header[Cache-Control、Expires]可以只啟用一個(gè),也可以同時(shí)啟用,當(dāng)response header中,Expires和Cache-Control同時(shí)存在時(shí)且時(shí)間不一致時(shí),Cache-Control優(yōu)先級(jí)高于Expires;
Last-Modified/If-Modified-SinceIf-Modified-Since,和 Last-Modified 一樣都是用于記錄頁面最后修改時(shí)間的 HTTP 頭信息,只是 Last-Modified 是由服務(wù)器往客戶端發(fā)送的 HTTP 頭,而 If-Modified-Since 則是由客戶端往服務(wù)器發(fā)送的頭,
在瀏覽器第一次請(qǐng)求某一個(gè)URL時(shí),服務(wù)器端的返回狀態(tài)會(huì)是200,內(nèi)容是你請(qǐng)求的資源,同時(shí)有一個(gè)Last-Modified的屬性標(biāo)記此文件在服務(wù)期端最后被修改的時(shí)間,格式類似這樣:
Last-Modified: Fri, 12 May 2006 18:53:33 GMT
客戶端第二次請(qǐng)求此URL時(shí),根據(jù) HTTP 協(xié)議的規(guī)定,瀏覽器會(huì)向服務(wù)器傳送 If-Modified-Since 報(bào)頭,詢問該時(shí)間之后文件是否有被修改過:
If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
如果服務(wù)器端的資源沒有變化,則自動(dòng)返回 HTTP 304 (Not Changed.)狀態(tài)碼,內(nèi)容為空,這樣就節(jié)省了傳輸數(shù)據(jù)量。當(dāng)服務(wù)器端代碼發(fā)生改變或者重啟服務(wù)器時(shí),則重新發(fā)出資源,返回和第一次請(qǐng)求時(shí)類似。從而保證不向客戶端重復(fù)發(fā)出資源,也保證當(dāng)服務(wù)器有變化時(shí),客戶端能夠得到最新的資源。
注意:ast-Modified標(biāo)注的最后修改只能精確到秒級(jí),如果某些文件在1秒鐘以內(nèi),被修改多次的話,它將不能準(zhǔn)確標(biāo)注文件的修改時(shí)間(無法及時(shí)更新文件) 如果某些文件會(huì)被定期生成,當(dāng)有時(shí)內(nèi)容并沒有任何變化,但Last-Modified卻改變了,導(dǎo)致文件沒法使用緩存,有可能存在服務(wù)器沒有準(zhǔn)確獲取文件修改時(shí)間,或者與代理服務(wù)器時(shí)間不一致等情形(無法使用緩存)。
當(dāng)與 If-None-Match 一同出現(xiàn)時(shí),它會(huì)被忽略掉,除非服務(wù)器不支持 If-None-Match。
Etag/If-None-MatchETag是響應(yīng)頭,If-None-Match是請(qǐng)求頭。Last-Modified / If-Modified-Since的主要缺點(diǎn)就是它只能精確到秒的級(jí)別,一旦在一秒的時(shí)間里出現(xiàn)了多次修改,那么Last-Modified / If-Modified-Since是無法體現(xiàn)的。相比較,ETag / If-None-Match沒有使用時(shí)間作為判斷標(biāo)準(zhǔn),而是使用一個(gè)特征串。Etag把Web組件的特征串告訴客戶端,客戶端在下次請(qǐng)求此Web組件的時(shí)候,會(huì)把上次服務(wù)端響應(yīng)的特征串作為If-None-Match的值發(fā)送給服務(wù)端,服務(wù)端可以通過這個(gè)值來判斷是否需要從重新發(fā)送,如果不需要,就簡(jiǎn)單的發(fā)送一個(gè)304狀態(tài)碼,客戶端將從緩存里直接讀取所需的Web組件。
HTTP 協(xié)議規(guī)格說明定義ETag為“被請(qǐng)求變量的實(shí)體值” (參見 ------ 章節(jié) 14.19)。 另一種說法是,ETag是一個(gè)可以與Web資源關(guān)聯(lián)的記號(hào)(token)。典型的Web資源可以一個(gè)Web頁,但也可能是JSON或XML文檔。服務(wù)器多帶帶負(fù)責(zé)判斷記號(hào)是什么及其含義,并在HTTP響應(yīng)頭中將其傳送到客戶端,以下是服務(wù)器端返回的格式:
ETag: "50b1c1d4f775c61:df3"
客戶端的查詢更新格式是這樣的:
If-None-Match: W/"50b1c1d4f775c61:df3"
如果ETag沒改變,則返回狀態(tài)304然后不返回,這也和Last-Modified一樣。本人測(cè)試Etag主要在斷點(diǎn)下載時(shí)比較有用。
當(dāng)使用Expires / Cache-Control的時(shí)候,盡量給圖片,樣式表,腳本等設(shè)置一個(gè)足夠大的緩存時(shí)間,如果在此期間,緩存文件有過修改,最簡(jiǎn)單的更新方式是改名或者 設(shè)置一個(gè)查詢參數(shù),比如開始圖片名是logo.gif,如果做了一個(gè)新的圖片,你想更新,可以把圖片改名為logo_v2.gif,或者給圖片設(shè)置一個(gè)查 詢參數(shù)logo.gif?foobar,這樣,瀏覽器就會(huì)去請(qǐng)求新的圖片了。不過,并不是所有的Web組件都適合有一個(gè)大的緩存時(shí)間,比如html,就不 適合使用過大的緩存時(shí)間,否則你在緩存到期前,就沒機(jī)會(huì)更新任何東西了。
使用Yslow的都知道,它不建議使用ETag,理由是Etag在分布式環(huán)境里,會(huì)給服務(wù)器造成不必要的壓力,比如說在Apache里,Etag缺省是由 三個(gè)因素決定的:INode Size MTime,而同一個(gè)圖片,在不同服務(wù)器上的INode是不同的,所以在兩個(gè)服務(wù)器上先后請(qǐng)求同一個(gè)圖片,會(huì)得到兩次200,雖然我們可以通過設(shè)置 FileETag Size MTime來屏蔽INode,從而達(dá)到一次200,一次304的效果,但304也是要通過一次條件GET請(qǐng)求驗(yàn)證的,所以說,還是通過Expires / Cache-Control來設(shè)置一個(gè)足夠大的緩存時(shí)間更劃算一些,如此說來,對(duì)圖片,樣式表,腳本等靜態(tài)內(nèi)容而言,設(shè)置一個(gè)大的過期時(shí)間是絕對(duì)必要的, 而Etag和Last-Modified則不是必要的。
參考:https://segmentfault.com/a/11...
http://www.cnblogs.com/wrmfw/...
https://developer.mozilla.org...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/61882.html
摘要:背景在開發(fā)好頁面后,如何讓頁面更快更好的運(yùn)行,是區(qū)分一個(gè)程序猿技術(shù)水平和視野的一個(gè)重要指標(biāo)。在對(duì)這些環(huán)節(jié)進(jìn)行優(yōu)化之前,我們需要知道如何監(jiān)控這些環(huán)節(jié)花費(fèi)了多少時(shí)間。為了優(yōu)化鏈接的環(huán)節(jié),前端這里還需要對(duì)資源使用,雪碧圖,代碼合并等手段。 背景 在開發(fā)好頁面后,如何讓頁面更快更好的運(yùn)行,是區(qū)分一個(gè)程序猿技術(shù)水平和視野的一個(gè)重要指標(biāo)。所以面試時(shí),面試官總會(huì)問你一個(gè)問題,如何進(jìn)行性能優(yōu)化呢? 如...
摘要:本文摘要域名解析建立連接發(fā)送請(qǐng)求服務(wù)器處理請(qǐng)求返回響應(yīng)結(jié)果關(guān)閉連接瀏覽器解析瀏覽器布局渲染總結(jié)當(dāng)我們?cè)跒g覽器輸入網(wǎng)址并回車后,一切從這里開始。 本文摘要:1.DNS域名解析;2.建立TCP連接;3.發(fā)送HTTP請(qǐng)求;4.服務(wù)器處理請(qǐng)求;5.返回響應(yīng)結(jié)果;6.關(guān)閉TCP連接;7.瀏覽器解析HTML;8.瀏覽器布局渲染;總結(jié) showImg(https://segmentfault.com...
摘要:本文摘要域名解析建立連接發(fā)送請(qǐng)求服務(wù)器處理請(qǐng)求返回響應(yīng)結(jié)果關(guān)閉連接瀏覽器解析瀏覽器布局渲染總結(jié)當(dāng)我們?cè)跒g覽器輸入網(wǎng)址并回車后,一切從這里開始。 本文摘要:1.DNS域名解析;2.建立TCP連接;3.發(fā)送HTTP請(qǐng)求;4.服務(wù)器處理請(qǐng)求;5.返回響應(yīng)結(jié)果;6.關(guān)閉TCP連接;7.瀏覽器解析HTML;8.瀏覽器布局渲染;總結(jié) showImg(https://segmentfault.com...
摘要:本文摘要域名解析建立連接發(fā)送請(qǐng)求服務(wù)器處理請(qǐng)求返回響應(yīng)結(jié)果關(guān)閉連接瀏覽器解析瀏覽器布局渲染總結(jié)當(dāng)我們?cè)跒g覽器輸入網(wǎng)址并回車后,一切從這里開始。 本文摘要:1.DNS域名解析;2.建立TCP連接;3.發(fā)送HTTP請(qǐng)求;4.服務(wù)器處理請(qǐng)求;5.返回響應(yīng)結(jié)果;6.關(guān)閉TCP連接;7.瀏覽器解析HTML;8.瀏覽器布局渲染;總結(jié) showImg(https://segmentfault.com...
摘要:本文摘要域名解析建立連接發(fā)送請(qǐng)求服務(wù)器處理請(qǐng)求返回響應(yīng)結(jié)果關(guān)閉連接瀏覽器解析瀏覽器布局渲染總結(jié)當(dāng)我們?cè)跒g覽器輸入網(wǎng)址并回車后,一切從這里開始。 本文摘要:1.DNS域名解析;2.建立TCP連接;3.發(fā)送HTTP請(qǐng)求;4.服務(wù)器處理請(qǐng)求;5.返回響應(yīng)結(jié)果;6.關(guān)閉TCP連接;7.瀏覽器解析HTML;8.瀏覽器布局渲染;總結(jié) showImg(https://segmentfault.com...
閱讀 4183·2023-04-26 02:40
閱讀 2667·2023-04-26 02:31
閱讀 2760·2021-11-15 18:08
閱讀 577·2021-11-12 10:36
閱讀 1436·2021-09-30 09:57
閱讀 5210·2021-09-22 15:31
閱讀 2640·2019-08-30 14:17
閱讀 1286·2019-08-30 12:58