摘要:緩存機制緩存機制主要由以下三部分組成緩存存儲策略這個策略的作用只有一個,用于決定響應(yīng)內(nèi)容是否可緩存到客戶端。如果判斷標(biāo)識無效,則返回,用新數(shù)據(jù)替換客戶端緩存。表示文件在本地應(yīng)該緩存,且有效時長是秒從發(fā)出請求算起。
HTTP緩存機制
HTTP緩存機制主要由以下三部分組成
緩存存儲策略這個策略的作用只有一個,用于決定 Http 響應(yīng)內(nèi)容是否可緩存到客戶端。主要通過Cache-Control來控制。
Cache-Control
max-age
public
private
no-cache
no-store
除了no-store其他都會被緩存到客戶端。
緩存過期策略這個策略的作用也只有一個,那就是決定客戶端是否可直接從本地緩存數(shù)據(jù)中加載數(shù)據(jù)并展示(否則就發(fā)請求到服務(wù)端獲?。?/p>
數(shù)據(jù)緩存到了本地后還需要經(jīng)過判斷才能使用,那么瀏覽器通過什么條件來判斷呢? 答案是:Expires,Expires 指名了緩存數(shù)據(jù)有效的絕對時間,告訴客戶端到了這個時間點(比照客戶端時間點)后本地緩存就作廢了,在這個時間點內(nèi)客戶端可以認為緩存數(shù)據(jù)有效,可直接從緩存中加載展示。
緩存對比策略將緩存在客戶端的數(shù)據(jù)標(biāo)識發(fā)往服務(wù)端,服務(wù)端通過標(biāo)識來判斷客戶端 緩存數(shù)據(jù)是否仍有效,進而決定是否要重發(fā)數(shù)據(jù)。
客戶端檢測到數(shù)據(jù)過期或瀏覽器刷新后,往往會重新發(fā)起一個 http 請求到服務(wù)器,服務(wù)器此時并不急于返回數(shù)據(jù),而是看請求頭有沒有帶標(biāo)識( If-Modified-Since、If-None-Match)過來,如果判斷標(biāo)識仍然有效,則返回304告訴客戶端取本地緩存數(shù)據(jù)來用即可(這里要注意的是你必須要在首次響應(yīng)時輸出相應(yīng)的頭信息(Last-Modified、ETags)到客戶端)。如果判斷標(biāo)識無效,則返回200,用新數(shù)據(jù)替換客戶端緩存。
ETags, If-None-MatchEtag是指根據(jù)實體內(nèi)容生成一段hash字符串,標(biāo)識資源的狀態(tài),由服務(wù)端產(chǎn)生。瀏覽器會將這串字符串傳回服務(wù)器,驗證資源是否已經(jīng)修改
Last-Modified, If-Modified-Since這兩個是HTTP1.0中用來驗證資源是否過期的請求/響應(yīng)頭,這兩個頭部都是日期,驗證過程與Etag類似。
總結(jié)Http 緩存機制實際上是 Http 緩存策略三個要素(緯度)相互作用的集合,所以在分析和設(shè)置 Http 報文緩存頭時,只要能從中精準的分解出緩存三要素,我們就能非常準確的預(yù)判到緩存設(shè)置最終能達到的效果。
實踐在html文件頭部加上如下標(biāo)簽,能使該文件每次去服務(wù)端做對比,若不同則返回新文件,若相同則取客戶端緩存。
或是在項目中添加NoCacheFilter.java文件,響應(yīng)頭添加相關(guān)屬性
HttpServletResponse resp = (HttpServletResponse) response; resp.setHeader("Cache-Control", "no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0"); resp.setHeader("Pragma", "no-cache");字段 HTTP1.0 緩存字段詳解
Pragma。 設(shè)置頁面是否緩存,為Pragma則緩存,no-cache則不緩存。
Expires。有了Pragma來禁用緩存,自然也需要有個東西來啟用緩存和定義緩存時間。如果Pragma頭部和Expires頭部同時存在,則起作用的會是Pragma。,響應(yīng)報文中Expires所定義的緩存時間是相對服務(wù)器上的時間而言的,其定義的是資源“失效時刻”,如果客戶端上的時間跟服務(wù)器上的時間不一致(特別是用戶修改了自己電腦的系統(tǒng)時間),那緩存時間可能就沒啥意義了。
HTTP1.1 緩存字段詳解Cache-Control: 定義緩存過期時間。若報文中同時出現(xiàn)了 Expires 和 Cache-Control,則以 Cache-Control 為準。
(1)max-age=600。 表示文件在本地應(yīng)該緩存,且有效時長是600秒(從發(fā)出請求算起)。在接下來600秒內(nèi),如果有請求這個資源,瀏覽器不會發(fā)出 HTTP 請求,而是直接使用本地緩存的文件。
(2)no-cache。實際上她是會被緩存的,只不過每次在向客戶端(瀏覽器)提供響應(yīng)數(shù)據(jù)時,==緩存都要向服務(wù)器評估緩存響應(yīng)的有效性==
(3)no-store
響應(yīng)不被緩存的意思。
Last-Modified / If-Modified-Since
(1)Last-Modified: 標(biāo)示這個響應(yīng)資源的最后修改時間。web服務(wù)器在響應(yīng)請求時,告訴瀏覽器資源的最后修改時間。
(2)If-Modified-Since:
當(dāng)資源過期時(使用Cache-Control標(biāo)識的max-age),發(fā)現(xiàn)資源具有Last-Modified聲明,則再次向web服務(wù)器請求時帶上頭 If-Modified-Since,表示請求時間。若服務(wù)端請求資源的最后修改時間較新,則響應(yīng)資源內(nèi)容(HTTP 200);若最后修改時間較舊,則響應(yīng)HTTP 304,告知瀏覽器繼續(xù)使用所保存的cache。
Etag/If-None-Match: Etag/If-None-Match也要配合Cache-Control使用。
(1)Etag: web服務(wù)器響應(yīng)請求時,告訴瀏覽器當(dāng)前資源在服務(wù)器的唯一標(biāo)識(生成規(guī)則由服務(wù)器覺得)
(2)If-None-Match: 當(dāng)資源過期時(使用Cache-Control標(biāo)識的max-age),發(fā)現(xiàn)資源具有Etage聲明,則再次向web服務(wù)器請求時帶上頭If-None-Match (Etag的值)。服務(wù)器與被請求資源的相應(yīng)校驗串進行比對,決定返回200或304。
既生Last-Modified何生Etag?
HTTP1.1中Etag的出現(xiàn)主要是為了解決幾個Last-Modified比較難解決的問題:
(1) Last-Modified標(biāo)注的最后修改只能精確到秒級,如果某些文件在1秒鐘以內(nèi),被修改多次的話,它將不能準確標(biāo)注文件的修改時間。
(2) 如果某些文件會被定期生成,當(dāng)有時內(nèi)容并沒有任何變化,但Last-Modified卻改變了,導(dǎo)致文件沒法使用緩存。
(3) 有可能存在服務(wù)器沒有準確獲取文件修改時間,或者與代理服務(wù)器時間不一致等情形。
Last-Modified與ETag是可以一起使用的,服務(wù)器會優(yōu)先驗證ETag,一致的情況下,才會繼續(xù)比對Last-Modified,最后才決定是否返回304。
小結(jié)(1)瀏覽器第一次請求
(2) 瀏覽器第二次請求
緩存的作用減少網(wǎng)絡(luò)帶寬消耗。
無論對于網(wǎng)站運營者或者用戶,帶寬都代表著金錢,過多的帶寬消耗,只會便宜了網(wǎng)絡(luò)運營商。當(dāng)Web緩存副本被使用時,只會產(chǎn)生極小的網(wǎng)絡(luò)流量,可以有效的降低運營成本。
降低服務(wù)器壓力
給網(wǎng)絡(luò)資源設(shè)定有效期之后,用戶可以重復(fù)使用本地的緩存,減少對源服務(wù)器的請求,間接降低服務(wù)器的壓力。同時,搜索引擎的爬蟲機器人也能根據(jù)過期機制降低爬取的頻率,也能有- 效降低服務(wù)器的壓力。
減少網(wǎng)絡(luò)延遲,提升頁面渲染速度
帶寬對于個人網(wǎng)站運營者來說是十分重要,緩存的使用能夠明顯加快頁面打開速度,達到更好的體驗。
參考鏈接https://juejin.im/entry/59c8d...
https://segmentfault.com/a/11...
https://mp.weixin.qq.com/s/qO...
https://segmentfault.com/a/11...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/61917.html
摘要:緩存緩存,也叫網(wǎng)關(guān)緩存反向代理緩存。瀏覽器先向網(wǎng)關(guān)發(fā)起請求,網(wǎng)關(guān)服務(wù)器后面對應(yīng)著一臺或多臺負載均衡源服務(wù)器,會根據(jù)它們的負載請求,動態(tài)將請求轉(zhuǎn)發(fā)到合適的源服務(wù)器上。雖然這種架構(gòu)負載均衡源服務(wù)器之間的緩存沒法共享,但卻擁有更好的處擴展性。 一、前言? 工作上遇到一個這樣的需求,一個H5頁面在APP端,如果勾選已讀狀態(tài),則下次打開該鏈接,會跳過此頁面。用到了HTML5 的本地存儲 API ...
摘要:對于瀏覽器緩存,相信很多開發(fā)者對它真的是又愛又恨。那么瀏覽器緩存究竟是個什么樣的神奇玩意呢什么是瀏覽器緩存簡單來說,瀏覽器緩存就是把一個已經(jīng)請求過的資源如頁面,圖片,,數(shù)據(jù)等拷貝一份副本儲存在瀏覽器中。 對于瀏覽器緩存,相信很多開發(fā)者對它真的是又愛又恨。一方面極大地提升了用戶體驗,而另一方面有時會因為讀取了緩存而展示了錯誤的東西,而在開發(fā)過程中千方百計地想把緩存禁掉。那么瀏覽器緩存究竟...
摘要:對于瀏覽器緩存,相信很多開發(fā)者對它真的是又愛又恨。那么瀏覽器緩存究竟是個什么樣的神奇玩意呢什么是瀏覽器緩存簡單來說,瀏覽器緩存就是把一個已經(jīng)請求過的資源如頁面,圖片,,數(shù)據(jù)等拷貝一份副本儲存在瀏覽器中。 對于瀏覽器緩存,相信很多開發(fā)者對它真的是又愛又恨。一方面極大地提升了用戶體驗,而另一方面有時會因為讀取了緩存而展示了錯誤的東西,而在開發(fā)過程中千方百計地想把緩存禁掉。那么瀏覽器緩存究竟...
瀏覽器緩存機制學(xué)習(xí)總結(jié) 最近在做一個考試系統(tǒng)時,由于經(jīng)常加載試卷或圖片等等靜態(tài)資源,抽空學(xué)習(xí)了一下緩存機制,在此記錄 為什么要使用緩存 1、通過HTTP協(xié)議,在客戶端和瀏覽器建立連接時需要消耗時間,而大的響應(yīng)需要在客戶端和服務(wù)器之間進行多次往返通信才能獲得完整的響應(yīng),這拖延了瀏覽器可以使用和處理內(nèi)容的時間。這就增加了訪問服務(wù)器的數(shù)據(jù)和資源的成本,因此利用瀏覽器的緩存機制重用以前獲取的數(shù)據(jù)就變成了性...
閱讀 1390·2021-11-04 16:11
閱讀 3049·2021-10-12 10:11
閱讀 2985·2021-09-29 09:47
閱讀 1622·2021-09-22 15:40
閱讀 1020·2019-08-29 15:43
閱讀 2811·2019-08-29 13:50
閱讀 1588·2019-08-29 13:28
閱讀 2697·2019-08-29 12:54