摘要:指示對于單個用戶的整個或部分響應(yīng)消息,不能被共享緩存處理。參考文章瀏覽器協(xié)議緩存機(jī)制詳解的實(shí)現(xiàn)原理寫給后端程序員的緩存原理介紹
說說web緩存
網(wǎng)上關(guān)于WEB緩存的文章很多,今天匯總一下。
為什么要用緩存一般針對靜態(tài)資源如CSS,JS,圖片等使用緩存,原因如下:
請求更快:通過將內(nèi)容緩存在本地瀏覽器或距離最近的緩存服務(wù)器(如CDN),在不影響網(wǎng)站交互的前提下可以大大加快網(wǎng)站加載速度。
節(jié)省帶寬:對于已緩存的文件,可以減少請求帶寬甚至無需請求網(wǎng)絡(luò)。
降低服務(wù)器壓力:在大量用戶并發(fā)請求的情況下,服務(wù)器的性能受到限制,此時將一些靜態(tài)資源放置在網(wǎng)絡(luò)的多個節(jié)點(diǎn),可以起到均衡負(fù)載的作用,降低服務(wù)器的壓力。
緩存分類緩存分為服務(wù)端側(cè)(server side,比如 Nginx、Apache)和客戶端側(cè)(client side,比如 web browser)。
常用的服務(wù)端緩存有CDN緩存,客戶端緩存就是指瀏覽器緩存。
瀏覽器緩存分為強(qiáng)緩存和協(xié)商緩存:
1 強(qiáng)緩存:瀏覽器在加載資源時,先根據(jù)這個資源的一些http header判斷它是否命中強(qiáng)緩存,強(qiáng)緩存如果命中,瀏覽器直接從自己的緩存中讀取資源,不會發(fā)請求到服務(wù)器。比如某個css文件,如果瀏覽器在加載它所在的網(wǎng)頁時,這個css文件的緩存配置命中了強(qiáng)緩存,瀏覽器就直接從緩存中加載這個css,連請求都不會發(fā)送到網(wǎng)頁所在服務(wù)器;
2 協(xié)商緩存:當(dāng)強(qiáng)緩存沒有命中的時候,瀏覽器一定會發(fā)送一個請求到服務(wù)器,通過服務(wù)器端依據(jù)資源的另外一些http header驗(yàn)證這個資源是否命中協(xié)商緩存,如果協(xié)商緩存命中,服務(wù)器會將這個請求返回(304),但是不會返回這個資源的數(shù)據(jù),而是告訴客戶端可以直接從緩存中加載這個資源,于是瀏覽器就又會從自己的緩存中去加載這個資源;若未命中請求,則將資源返回客戶端,并更新本地緩存數(shù)據(jù)(200)。
強(qiáng)緩存與協(xié)商緩存區(qū)別:強(qiáng)緩存不發(fā)請求到服務(wù)器,協(xié)商緩存會發(fā)請求到服務(wù)器。
如何設(shè)置緩存1 HTML Meta標(biāo)簽控制緩存(非HTTP協(xié)議定義)
上述代碼的作用是告訴瀏覽器當(dāng)前頁面不被緩存,每次訪問都需要去服務(wù)器拉取。這種方法使用上很簡單,但只有部分瀏覽器可以支持,而且所有緩存代理服務(wù)器都不支持,因?yàn)榇聿唤馕鯤TML內(nèi)容本身。
2 HTTP頭信息控制緩存
HTTP頭信息控制緩存是通過Expires(強(qiáng)緩存)、Cache-control(強(qiáng)緩存)、Last-Modified/If-Modified-Since(協(xié)商緩存)、Etag/If-None-Match(協(xié)商緩存)實(shí)現(xiàn),下面詳細(xì)介紹。
1)Expires是http1.0提出的一個表示資源過期時間的header,它描述的是一個絕對時間,由服務(wù)器返回,用GMT格式的字符串表示,如:Expires:Thu, 31 Dec 2016 23:55:55 GMT,
讀取緩存數(shù)據(jù)條件:緩存過期時間(服務(wù)器的)< 當(dāng)前時間(客戶端的
缺點(diǎn):Expires是較老的強(qiáng)緩存管理header,由于它是服務(wù)器返回的一個絕對時間,這樣存在一個問題,如果客戶端的時間與服務(wù)器的時間相差很大(比如時鐘不同步,或者跨時區(qū)),那么誤差就很大,所以在HTTP 1.1版開始,使用Cache-Control: max-age=秒替代。
2)Cache-Control描述的是一個相對時間,在進(jìn)行緩存命中的時候,都是利用客戶端時間進(jìn)行判斷,所以相比較Expires,Cache-Control的緩存管理更有效,安全一些。
讀取緩存數(shù)據(jù)條件:上次緩存時間(客戶端的)+max-age < 當(dāng)前時間(客戶端的)
Cache-Control值可以是public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age
各個消息中的指令含義如下: Public指示響應(yīng)可被任何緩存區(qū)緩存。 Private指示對于單個用戶的整個或部分響應(yīng)消息,不能被共享緩存處理。這允許服務(wù)器僅僅描述當(dāng)前用戶的部分響應(yīng)消息,此響應(yīng)消息對于其他用戶的請求無效。 no-cache指示請求或響應(yīng)消息不能緩存,該選項并不是說可以設(shè)置”不緩存“,而是需要和服務(wù)器確認(rèn) no-store在請求消息中發(fā)送將使得請求和響應(yīng)消息都不使用緩存,完全不存下來。 max-age指示客戶機(jī)可以接收生存期不大于指定時間(以秒為單位)的響應(yīng)。上次緩存時間(客戶端的)+max-age(64200s)<客戶端當(dāng)前時間 min-fresh指示客戶機(jī)可以接收響應(yīng)時間小于當(dāng)前時間加上指定時間的響應(yīng)。 max-stale指示客戶機(jī)可以接收超出超時期間的響應(yīng)消息。如果指定max-stale消息的值,那么客戶機(jī)可以接收超出超時期指定值之內(nèi)的響應(yīng)消息。
注意:這兩個header可以只啟用一個,也可以同時啟用,當(dāng)response header中,Expires和Cache-Control同時存在時,Cache-Control優(yōu)先級高于Expires:
3)Last-Modified/If-Modified-Since:Last-Modified/If-Modified-Since要配合Cache-Control使用。
Last-Modified:標(biāo)示這個響應(yīng)資源的最后修改時間。web服務(wù)器在響應(yīng)請求時,告訴瀏覽器資源的最后修改時間。
If-Modified-Since:當(dāng)資源過期時(強(qiáng)緩存失效),發(fā)現(xiàn)資源具有Last-Modified聲明,則再次向web服務(wù)器請求時帶上頭 If-Modified-Since,表示請求時間。web服務(wù)器收到請求后發(fā)現(xiàn)有頭If-Modified-Since 則與被請求資源的最后修改時間進(jìn)行比對。若最后修改時間較新,說明資源又被改動過,則響應(yīng)整片資源內(nèi)容(寫在響應(yīng)消息包體內(nèi)),HTTP 200;若最后修改時間較舊,說明資源無新修改,則響應(yīng)HTTP 304 (無需包體,節(jié)省瀏覽),告知瀏覽器繼續(xù)使用所保存的cache。
缺點(diǎn):
Last-Modified標(biāo)注的最后修改只能精確到秒級,如果某些文件在1秒鐘以內(nèi),被修改多次的話,它將不能準(zhǔn)確標(biāo)注文件的修改時間(無法及時更新文件)
如果某些文件會被定期生成,當(dāng)有時內(nèi)容并沒有任何變化,但Last-Modified卻改變了,導(dǎo)致文件沒法使用緩存,有可能存在服務(wù)器沒有準(zhǔn)確獲取文件修改時間,或者與代理服務(wù)器時間不一致等情形(無法使用緩存)。
HTTP1.1中Etag解決了上述問題。
4)Etag/If-None-Match:Etag/If-None-Match也要配合Cache-Control使用。
Etag:web服務(wù)器響應(yīng)請求時,告訴瀏覽器當(dāng)前資源在服務(wù)器的唯一標(biāo)識(生成規(guī)則由服務(wù)器決定)。Apache中,ETag的值,默認(rèn)是對文件的索引節(jié)(INode),大小(Size)和最后修改時間(MTime)進(jìn)行Hash后得到的。
If-None-Match:當(dāng)資源過期時(使用Cache-Control標(biāo)識的max-age),發(fā)現(xiàn)資源具有Etage聲明,則再次向web服務(wù)器請求時帶上頭If-None-Match (Etag的值)。web服務(wù)器收到請求后發(fā)現(xiàn)有頭If-None-Match 則與被請求資源的相應(yīng)校驗(yàn)串進(jìn)行比對,決定返回200或304。
Etag是服務(wù)器自動生成或者由開發(fā)者生成的對應(yīng)資源在服務(wù)器端的唯一標(biāo)識符,能夠更加準(zhǔn)確的控制緩存。Last-Modified與ETag一起使用時,服務(wù)器會優(yōu)先驗(yàn)證ETag。
Etag
2 瀏覽器請求流程圖
瀏覽器第一次請求流程圖
瀏覽器再次請求時
3、用戶行為與緩存
瀏覽器緩存行為還有用戶的行為有關(guān),引用文章瀏覽器 HTTP 協(xié)議緩存機(jī)制詳解的結(jié)論
CDN緩存屬于Cache服務(wù)器的一種。
CDN的全稱是Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò)。其目的是通過在現(xiàn)有的Internet中增加一層新的網(wǎng)絡(luò)架構(gòu),將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的網(wǎng)絡(luò)"邊緣",使用戶可 以就近取得所需的內(nèi)容,解決Internet網(wǎng)絡(luò)擁塞狀況,提高用戶訪問網(wǎng)站的響應(yīng)速度。從技術(shù)上全面解決由于網(wǎng)絡(luò)帶寬小、用戶訪問量大、網(wǎng)點(diǎn)分布不均等 原因,解決用戶訪問網(wǎng)站的響應(yīng)速度慢的根本原因。
通過上圖,我們可以了解到,使用了CDN緩存后的網(wǎng)站的訪問過程為:
1)、用戶向?yàn)g覽器提供要訪問的域名;
2)、瀏覽器調(diào)用域名解析庫對域名進(jìn)行解析,由于CDN對域名解析過程進(jìn)行了調(diào)整,所以解析函數(shù)庫一般得到的是該域名對應(yīng)的CNAME記錄,為了得到實(shí)際IP地址,瀏覽器需要再次對獲得的CNAME域名進(jìn)行解析以得到實(shí)際的IP地址;在此過程中,使用的全局負(fù)載均衡DNS解析,如根據(jù)地理位置信 息解析對應(yīng)的IP地址,使得用戶能就近訪問。
3)、此次解析得到CDN緩存服務(wù)器的IP地址,瀏覽器在得到實(shí)際的IP地址以后,向緩存服務(wù)器發(fā)出訪問請求;
4)、若請求文件并未修改,返回304(充當(dāng)服務(wù)器的角色)。若當(dāng)前文件已過期,則緩存服務(wù)器根據(jù)瀏覽器提供的要訪問的域名,通過Cache內(nèi)部專用DNS解析得到此域名的實(shí)際IP地址,再由緩存服務(wù)器向此實(shí)際IP地址提交訪問請求;
5)、緩存服務(wù)器從實(shí)際IP地址得得到內(nèi)容以后,一方面在本地進(jìn)行保存,以備以后使用,二方面把獲取的數(shù)據(jù)返回給客戶端,完成數(shù)據(jù)服務(wù)過程;
6)、客戶端得到由緩存服務(wù)器返回的數(shù)據(jù)以后顯示出來并完成整個瀏覽的數(shù)據(jù)請求過程。
參考文章:
1 瀏覽器 HTTP 協(xié)議緩存機(jī)制詳解
2 CDN的實(shí)現(xiàn)原理
3 寫給后端程序員的HTTP緩存原理介紹
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/61814.html
摘要:緩存詳解標(biāo)簽空格分隔緩存緩存之于性能優(yōu)化請求更快通過將內(nèi)容緩存在本地瀏覽器或距離最近的緩存服務(wù)器如,在不影響網(wǎng)站交互的前提下可以大大加快網(wǎng)站加載速度。強(qiáng)制緩存不發(fā)請求到服務(wù)器,協(xié)商緩存會發(fā)請求到服務(wù)器。參考瀏覽器協(xié)議緩存機(jī)制詳解 Web緩存詳解 標(biāo)簽(空格分隔): 緩存 緩存之于性能優(yōu)化 請求更快:通過將內(nèi)容緩存在本地瀏覽器或距離最近的緩存服務(wù)器(如CDN),在不影響網(wǎng)站交互的前提...
摘要:緩存詳解標(biāo)簽空格分隔緩存緩存之于性能優(yōu)化請求更快通過將內(nèi)容緩存在本地瀏覽器或距離最近的緩存服務(wù)器如,在不影響網(wǎng)站交互的前提下可以大大加快網(wǎng)站加載速度。強(qiáng)制緩存不發(fā)請求到服務(wù)器,協(xié)商緩存會發(fā)請求到服務(wù)器。參考瀏覽器協(xié)議緩存機(jī)制詳解 Web緩存詳解 標(biāo)簽(空格分隔): 緩存 緩存之于性能優(yōu)化 請求更快:通過將內(nèi)容緩存在本地瀏覽器或距離最近的緩存服務(wù)器(如CDN),在不影響網(wǎng)站交互的前提...
摘要:歡迎來我的個人站點(diǎn)性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開啟性能優(yōu)化之旅高性能滾動及頁面渲染優(yōu)化理論寫法對壓縮率的影響唯快不破應(yīng)用的個優(yōu)化步驟進(jìn)階鵝廠大神用直出實(shí)現(xiàn)網(wǎng)頁瞬開緩存網(wǎng)頁性能管理詳解寫給后端程序員的緩存原理介紹年底補(bǔ)課緩存機(jī)制優(yōu)化動 歡迎來我的個人站點(diǎn) 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開啟性能優(yōu)化之旅 高性能滾動 scroll 及頁面渲染優(yōu)化 理論 | HTML寫法...
摘要:歡迎來我的個人站點(diǎn)性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開啟性能優(yōu)化之旅高性能滾動及頁面渲染優(yōu)化理論寫法對壓縮率的影響唯快不破應(yīng)用的個優(yōu)化步驟進(jìn)階鵝廠大神用直出實(shí)現(xiàn)網(wǎng)頁瞬開緩存網(wǎng)頁性能管理詳解寫給后端程序員的緩存原理介紹年底補(bǔ)課緩存機(jī)制優(yōu)化動 歡迎來我的個人站點(diǎn) 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開啟性能優(yōu)化之旅 高性能滾動 scroll 及頁面渲染優(yōu)化 理論 | HTML寫法...
閱讀 902·2021-11-22 13:53
閱讀 2533·2021-10-15 09:40
閱讀 1001·2021-10-14 09:42
閱讀 3475·2021-09-22 15:59
閱讀 888·2021-09-02 09:47
閱讀 2367·2019-08-30 15:54
閱讀 1438·2019-08-29 17:14
閱讀 399·2019-08-29 15:15