瀏覽器緩存機(jī)制post
1、瀏覽器緩存機(jī)制
有dns的地方,就有緩存。瀏覽器、操作系統(tǒng)、Local DNS、根域名服務(wù)器,它們都會(huì)對(duì)DNS結(jié)果做一定程度的緩存。
DNS查詢過程如下:
首先搜索瀏覽器自身的DNS緩存,如果存在,則域名解析到此完成。
如果瀏覽器自身的緩存里面沒有找到對(duì)應(yīng)的條目,那么會(huì)嘗試讀取操作系統(tǒng)的hosts文件看是否存在對(duì)應(yīng)的映射關(guān)系,如果存在,則域名解析到此完成。
如果本地hosts文件不存在映射關(guān)系,則查找本地DNS服務(wù)器(ISP服務(wù)器,或者自己手動(dòng)設(shè)置的DNS服務(wù)器),如果存在,域名到此解析完成。
如果本地DNS服務(wù)器還沒找到的話,它就會(huì)向根服務(wù)器發(fā)出請(qǐng)求,進(jìn)行遞歸查詢。
瀏覽器本地緩存失效后,瀏覽器會(huì)向CDN邊緣節(jié)點(diǎn)發(fā)起請(qǐng)求。類似瀏覽器緩存,CDN邊緣節(jié)點(diǎn)也存在著一套緩存機(jī)制。CDN邊緣節(jié)點(diǎn)緩存策略因服務(wù)商不同而不同,但一般都會(huì)遵循h(huán)ttp標(biāo)準(zhǔn)協(xié)議,通過http響應(yīng)頭中的
Cache-control: max-age 的字段來設(shè)置CDN邊緣節(jié)點(diǎn)數(shù)據(jù)緩存時(shí)間。
當(dāng)瀏覽器向CDN節(jié)點(diǎn)請(qǐng)求數(shù)據(jù)時(shí),CDN節(jié)點(diǎn)會(huì)判斷緩存數(shù)據(jù)是否過期,若緩存數(shù)據(jù)并沒有過期,則直接將緩存數(shù)據(jù)返回給客戶端;否則,CDN節(jié)點(diǎn)就會(huì)向服務(wù)器發(fā)出回源請(qǐng)求,從服務(wù)器拉取最新數(shù)據(jù),更新本地緩存,并將最新數(shù)據(jù)返回給客戶端。 CDN服務(wù)商一般會(huì)提供基于文件后綴、目錄多個(gè)維度來指定CDN緩存時(shí)間,為用戶提供更精細(xì)化的緩存管理。
CDN 優(yōu)勢(shì)
CDN節(jié)點(diǎn)解決了跨運(yùn)營(yíng)商和跨地域訪問的問題,訪問延時(shí)大大降低。
大部分請(qǐng)求在CDN邊緣節(jié)點(diǎn)完成,CDN起到了分流作用,減輕了源服務(wù)器的負(fù)載。
http請(qǐng)求報(bào)文(request)
請(qǐng)求行
請(qǐng)求方法 空格 URL 空格 協(xié)議版本 回車符 換行符
請(qǐng)求頭(通用信息頭、請(qǐng)求頭、實(shí)體頭)
頭部字段名 冒號(hào) 值 回車鍵 換行符
...
頭部字段名 冒號(hào) 值 回車鍵 換行符
空行
回車符 換行符
實(shí)體主體(只有post請(qǐng)求有)
主體
http響應(yīng)報(bào)文(response)
狀態(tài)行
協(xié)議版本 空格 狀態(tài)碼 空格 狀態(tài)碼描述 回車符 換行符
響應(yīng)頭部
頭部字段名 冒號(hào) 值 回車符 換行符
...
頭部字段名 冒號(hào) 值 回車符 換行符
空行
回車符 換行符
響應(yīng)正文
正文
瀏覽器初次向服務(wù)器發(fā)起請(qǐng)求后拿到請(qǐng)求結(jié)果,會(huì)根據(jù)響應(yīng)報(bào)文中HTTP頭的緩存標(biāo)識(shí),決定是否緩存返回的結(jié)果,是則將請(qǐng)求結(jié)果和緩存標(biāo)識(shí)存入瀏覽器緩存中
瀏覽器每次發(fā)起請(qǐng)求,都會(huì)現(xiàn)在瀏覽器緩存中查找該請(qǐng)求的結(jié)果以及緩存標(biāo)識(shí)
瀏覽器 瀏覽器緩存 服務(wù)器
——————第一次發(fā)起http請(qǐng)求——————>
<——沒有該請(qǐng)求的緩存結(jié)果和緩存標(biāo)識(shí)————
——————————————發(fā)起http請(qǐng)求——————————————>
<——————————返回該請(qǐng)求結(jié)果和緩存規(guī)則————————————
——將請(qǐng)求結(jié)果和緩存標(biāo)識(shí)存入瀏覽器緩存——>
強(qiáng)制緩存就是向?yàn)g覽器緩存查找結(jié)果,并根據(jù)該結(jié)果的緩存規(guī)則來決定是否使用該緩存結(jié)果的過程
強(qiáng)制緩存的情況分為三種:
1、不存在該緩存結(jié)果和緩存標(biāo)識(shí),強(qiáng)制緩存失效,直接向服務(wù)器發(fā)起請(qǐng)求
2、存在該緩存結(jié)果和緩存標(biāo)識(shí),但結(jié)果已經(jīng)失效,強(qiáng)制緩存失效,使用協(xié)商緩存
3、存在該緩存結(jié)果和緩存標(biāo)識(shí),且該結(jié)果沒有失效,強(qiáng)制緩存生效,直接返回該結(jié)果
控制強(qiáng)制緩存的字段:Expires,Cache-Control
Expires 是 HTTP/1.0 控制緩存的字段,值為服務(wù)器返回該請(qǐng)求的結(jié)果緩存時(shí)間
即再次發(fā)送請(qǐng)求是,客戶端時(shí)間 小于 Expires的值,直接使用緩存結(jié)果
Cache-Control 是HTTP/1.1的規(guī)則,主要用于控制網(wǎng)頁(yè)緩存,主要取值為:
public:所有的內(nèi)容都緩存(客戶端和代理服務(wù)器都可以緩存)
private:所有內(nèi)容只有客戶端可以緩存(默認(rèn)值)
no-cache:客戶端緩存內(nèi)容,但是是否使用緩存則需要經(jīng)過協(xié)商緩存來驗(yàn)證決定
no-store:即不使用強(qiáng)制緩存,也不使用協(xié)商緩存
max-age=xxx:緩存內(nèi)容將在xxx秒后失效
Expires 是一個(gè)絕對(duì)值
Cache-Control 中 max-age 是相對(duì)值,解決了 Expires時(shí)期 服務(wù)端與客戶端 可能出現(xiàn)時(shí)間差的問題
注:Expires和Cache-Control同時(shí)存在時(shí),只有Cache-Control生效
協(xié)商緩存就是強(qiáng)制緩存失效后,瀏覽器攜帶緩存標(biāo)識(shí)向服務(wù)器發(fā)起請(qǐng)求,由服務(wù)器根據(jù)緩存標(biāo)識(shí)決定是否使用緩存的過程
協(xié)商緩存的兩種情況:
1、協(xié)商緩存生效,返回304,繼續(xù)使用緩存
過程:
瀏覽器 瀏覽器緩存 服務(wù)器
————————發(fā)起http請(qǐng)求————————>
<——該請(qǐng)求的緩存結(jié)果失效,只返回緩存標(biāo)識(shí)——
————————攜帶該資源的緩存標(biāo)識(shí),發(fā)起http請(qǐng)求————————>
<—————————————304,該資源無更新————————————
——————獲取該請(qǐng)求的緩存結(jié)果——————>
<——————返回該請(qǐng)求的緩存結(jié)果——————
2、協(xié)商緩存失敗,返回200和請(qǐng)求結(jié)果
過程:
瀏覽器 瀏覽器緩存 服務(wù)器
————————發(fā)起http請(qǐng)求————————>
<——該請(qǐng)求的緩存結(jié)果失效,只返回緩存標(biāo)識(shí)——
————————攜帶該資源的緩存標(biāo)識(shí),發(fā)起http請(qǐng)求————————>
<————————200,資源已更新,重新返回請(qǐng)求和結(jié)果———————
——將該請(qǐng)求結(jié)果和緩存標(biāo)識(shí)存入瀏覽器緩存中—>
協(xié)商緩存的標(biāo)識(shí)也是在響應(yīng)報(bào)文的HTTP頭中和請(qǐng)求結(jié)果一起返回給瀏覽器的
控制協(xié)商緩存的字段:
(1) Last-Modified/If-Modified-Since:Last-Modified是服務(wù)器響應(yīng)請(qǐng)求是,返回該資源文件在服務(wù)器最后被修改的時(shí)間;If-Modified-Since再次發(fā)起請(qǐng)求時(shí),攜帶上次返回的Last-Modified的值,服務(wù)器將該字段值與該資源最后修改時(shí)間對(duì)比,決定是否用緩存
(2)Etag/If-None-Match:Etag服務(wù)器響應(yīng)請(qǐng)求時(shí),返回當(dāng)前資源文件的一個(gè)唯一標(biāo)識(shí),由服務(wù)器生成之;If-None-Match是再次發(fā)起請(qǐng)求時(shí),攜帶上次返回的唯一標(biāo)識(shí)Etag的值,服務(wù)器收到后,將該字段值與該資源在服務(wù)器上的Etag對(duì)比,一致 則返回304,否則返回200
注:Etag/If-None-Match優(yōu)先級(jí)高于Last-Modified/If-Modified-Since,同時(shí)存在時(shí)只有Etag/If-None-Match生效
瀏覽器緩存分為:內(nèi)存緩存 和 硬盤緩存
內(nèi)存緩存特性:
(1)快速讀取:內(nèi)存緩存會(huì)將編譯解析后的文件,存入該進(jìn)程的內(nèi)存中,便于下次運(yùn)行時(shí)快速讀取
(2)時(shí)效性:一旦關(guān)閉進(jìn)程,進(jìn)程內(nèi)存清空
硬盤緩存特性:
永久性:直接寫入硬盤文件中
復(fù)雜、緩慢:讀取緩存對(duì)該緩存存放的硬盤文件進(jìn)行I/O操作,重新解析
from memory cache:使用內(nèi)存中的緩存
from disk cache:使用硬盤中的緩存
瀏覽器讀取順序:memory ——> disk
瀏覽器將js和圖片等文件解析執(zhí)行后直接存入內(nèi)存緩存中,F(xiàn)5刷新頁(yè)面時(shí),from memory cache(使用內(nèi)存中的緩存)
css文件存入硬盤中,F(xiàn)5刷新頁(yè)面時(shí),from disk cache(使用硬盤中的緩存)
參考文章
https://segmentfault.com/a/1190000017962411
https://www.cnblogs.com/chengxs/p/10396066.html
2、為什么蘋果瀏覽器返回一次刷新一次
您好,很高興為您解答:蘋果瀏覽器返回一次刷新一次是因?yàn)樗褂昧艘环N叫做“緩存機(jī)制”的機(jī)制,來提高瀏覽器的速度和性能,從而可以節(jié)省網(wǎng)絡(luò)數(shù)據(jù),減少下載的內(nèi)容,提升瀏覽器的體驗(yàn)。緩存機(jī)制的關(guān)鍵一步就是檢測(cè)網(wǎng)頁(yè)上的內(nèi)容是否有變化,以決定是否需要重新加載網(wǎng)頁(yè)。蘋果瀏覽器會(huì)把頁(yè)面緩存,如果有任何更改,就會(huì)立即重新加載網(wǎng)頁(yè),這樣可以保證你的網(wǎng)頁(yè)有最新內(nèi)容出來。這也就是為什么蘋果瀏覽器總是返回一次刷新一次的原因。希望可以幫到您,祝您生活愉快。 瀏覽器沒有緩存功能。蘋果瀏覽器返回刷新原因是,瀏覽器沒有緩存功能。每次打開一個(gè)網(wǎng)頁(yè)后,要返回上一頁(yè)的時(shí)候,都要重新加載。通常都是靜態(tài)的重新打開可以使搜索速度更快更流暢。
3、瀏覽器中的緩存
在我們使用瀏覽器訪問網(wǎng)頁(yè)的過程中,瀏覽器經(jīng)常會(huì)緩存各種網(wǎng)頁(yè)中的內(nèi)容。當(dāng)再次訪問同一個(gè)網(wǎng)頁(yè)時(shí),可以發(fā)現(xiàn)部分內(nèi)容是從緩存直接讀取的。查看HTTP的響應(yīng)信息,就能發(fā)現(xiàn)一些端倪。比如響應(yīng) 200 from cache; 304 not modify 等等。
下面對(duì)瀏覽器使用緩存的各種情形做一下分析:
Pragma是HTTP 1.0版本的一個(gè)參數(shù),在HTTP 1.1版本里面這個(gè)參數(shù)也會(huì)生效,如果不想瀏覽器緩存網(wǎng)頁(yè)的內(nèi)容,可以在 Response header 里面加上 :Pragma: no-cache。
Cache-Control是HTTP 1.1版本新增的一個(gè)參數(shù)。
Cache-Control:no-store 不允許緩存
Cache-Control:no-cache 不允許直接使用緩存,需要先發(fā)起請(qǐng)求和服務(wù)器協(xié)商(這個(gè)經(jīng)常被誤認(rèn)為是不允許緩存,實(shí)際上它的作用是讓瀏覽器在使用緩存前先請(qǐng)求服務(wù)端一次,確認(rèn)內(nèi)容是否有更新)
這樣的響應(yīng)代表沒有跟服務(wù)端進(jìn)行交互,內(nèi)容是直接從本地讀取的。
Expires和Cache-control: max-age= 有類似的作用,都是指定緩存內(nèi)容的有效周期,Expires指定的格式是格林威治時(shí)間,max-age則是秒數(shù)。
服務(wù)端也可以在 Response header 里加上 Last-Modified,它的格式是格林威治時(shí)間,再次請(qǐng)求時(shí),瀏覽器的 Request header 中會(huì)多出一個(gè)叫 If-Modified-Since的值,通過比較這兩個(gè)值是否一致來決定是否返回304。
ETag的用法和 Last-Modified 類似,值是一種文件指紋。比如:ETag:"5a3ccff0-5dc"。
服務(wù)端在 Response header 里加上 ETag,再次請(qǐng)求時(shí),瀏覽器的 Request header 中會(huì)多出一個(gè)叫 If-None-Match的值,通過比較這兩個(gè)值是否一致來決定是否返回304。
總體來說,瀏覽器使用緩存時(shí)有兩種表現(xiàn):
1.直接從本地讀取,不與服務(wù)端有交互,就是 200 OK (from memory cache)。
2.請(qǐng)求一次服務(wù)端,查看本地緩存是否生效,這種方式叫 協(xié)商緩存。如果服務(wù)端判斷緩存有效,將不返回完整內(nèi)容,而是返回 304 Not Modified。
在優(yōu)先級(jí)上 Pragma > Cache-Control > Expires。
4、web前端緩存機(jī)制
前端緩存機(jī)制有多種,如瀏覽器緩存、CDN緩存、DNS緩存、代理服務(wù)器緩存等。CDN全稱是Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò)。CDN的原理是將資源存放在各地的緩存服務(wù)器上,當(dāng)用戶請(qǐng)求資源時(shí),從就近的服務(wù)器上返回緩存的資源,而不需要每次都從源服務(wù)器獲取,減輕源服務(wù)器的壓力,又能提升用戶的訪問速度。
瀏覽器可以將用戶請(qǐng)求的資源進(jìn)行緩存,存放在本地。瀏覽器緩存一般通過請(qǐng)求頭來設(shè)置。
與瀏覽器緩存有關(guān)的頭部有:
瀏覽器會(huì)將服務(wù)器的域名與IP地址的映射緩存在本地,這樣用戶在訪問網(wǎng)站時(shí),不用每次都去查詢DNS映射表。
在瀏覽器和服務(wù)器之間架設(shè)的一個(gè)服務(wù)器 ,這個(gè)代理服務(wù)器會(huì)幫助瀏覽器去請(qǐng)求頁(yè)面,然后將頁(yè)面進(jìn)行處理和壓縮(例如壓縮圖片和文件),使頁(yè)面變小,再傳輸給瀏覽器。大部分代理服務(wù)器都有緩存的功能,如果瀏覽器所請(qǐng)求的文件在它本機(jī)中存在且是最新的,就不需要再?gòu)脑捶?wù)器請(qǐng)求數(shù)據(jù),提高了瀏覽速度。
在瀏覽某個(gè)頁(yè)面時(shí),瀏覽器會(huì)判斷頁(yè)面的關(guān)聯(lián)內(nèi)容,進(jìn)行預(yù)加載。用戶在瀏覽A頁(yè)面時(shí),就加載好B頁(yè)面,這樣當(dāng)用戶去訪問B頁(yè)面時(shí),B頁(yè)面很快就出來,提升了用戶體驗(yàn)。但這個(gè)機(jī)制有一定的缺陷,就是預(yù)判不一定準(zhǔn)確,可能會(huì)造成流量和資源的浪費(fèi)。
5、北大青鳥java培訓(xùn):瀏覽器緩存功能在使用上都有哪些類型?
緩存功能的存在,讓我們?cè)跒g覽網(wǎng)頁(yè)和訪問防止的時(shí)候可以更快的加載我們需要的內(nèi)容,而今天北大青鳥http://www.kmbdqn.cn/就通過案例分析來了解一下,瀏覽器的緩存功能在使用上都有哪些類型。
1.ServiceWorkerServiceWorker是運(yùn)行在瀏覽器背后的獨(dú)立線程,一般可以用來實(shí)現(xiàn)緩存功能。
使用ServiceWorker的話,傳輸協(xié)議必須為HTTPS。
因?yàn)镾erviceWorker中涉及到請(qǐng)求攔截,所以必須使用HTTPS協(xié)議來保障安全。
ServiceWorker的緩存與瀏覽器其他內(nèi)建的緩存機(jī)制不同,它可以讓我們自由控制緩存哪些文件、如何匹配緩存、如何讀取緩存,并且緩存是持續(xù)性的。
ServiceWorker實(shí)現(xiàn)緩存功能一般分為三個(gè)步驟:先需要先注冊(cè)ServiceWorker,然后監(jiān)聽到install事件以后就可以緩存需要的文件,那么在下次用戶訪問的時(shí)候就可以通過攔截請(qǐng)求的方式查詢是否存在緩存,存在緩存的話就可以直接讀取緩存文件,否則就去請(qǐng)求數(shù)據(jù)。
當(dāng)ServiceWorker沒有命中緩存的時(shí)候,我們需要去調(diào)用fetch函數(shù)獲取數(shù)據(jù)。
也就是說,如果我們沒有在ServiceWorker命中緩存的話,會(huì)根據(jù)緩存查找優(yōu)先級(jí)去查找數(shù)據(jù)。
但是不管我們是從MemoryCache中還是從網(wǎng)絡(luò)請(qǐng)求中獲取的數(shù)據(jù),瀏覽器都會(huì)顯示我們是從ServiceWorker中獲取的內(nèi)容。
2.MemoryCacheMemoryCache也就是內(nèi)存中的緩存,主要包含的是當(dāng)前中頁(yè)面中已經(jīng)抓取到的資源,例如頁(yè)面上已經(jīng)下載的樣式、腳本、圖片等。
讀取內(nèi)存中的數(shù)據(jù)肯定比磁盤快,內(nèi)存緩存雖然讀取高效,可是緩存持續(xù)性很短,會(huì)隨著進(jìn)程的釋放而釋放。
一旦我們關(guān)閉Tab頁(yè)面,內(nèi)存中的緩存也就被釋放了。
那么既然內(nèi)存緩存這么高效,我們是不是能讓數(shù)據(jù)都存放在內(nèi)存中呢?這是不可能的。
計(jì)算機(jī)中的內(nèi)存一定比硬盤容量小得多,操作系統(tǒng)需要精打細(xì)算內(nèi)存的使用,所以能讓我們使用的內(nèi)存必然不多。

轉(zhuǎn)載請(qǐng)帶上網(wǎng)址:http://www.javbus2020.com/posjitwo/118930.html
- 上一篇:pos機(jī)用的方便嗎
- 下一篇:pos機(jī)沒有sim卡