摘要:如果發(fā)送請(qǐng)求的時(shí)間在之前,那么本地緩存始終有效,否則就會(huì)發(fā)送請(qǐng)求到服務(wù)器來(lái)獲取資源。不使用本地緩存,需要使用協(xié)商緩存。直接禁止瀏覽器緩存數(shù)據(jù)。
每天系統(tǒng)復(fù)習(xí)一個(gè)知識(shí)點(diǎn) http緩存
http緩存主要分為了兩類(lèi) 強(qiáng)緩存(本地緩存)和協(xié)商緩存
瀏覽器在請(qǐng)求某一資源時(shí),會(huì)先獲取改資源緩存的header信息,判斷是否命中強(qiáng)緩存(expires的信息和cache-control)若命中直接從緩存中獲取該資源信息,包括緩存header信息,本次請(qǐng)求根本就不會(huì)與服務(wù)器進(jìn)行通信。此為強(qiáng)緩存(本地緩存)
如果沒(méi)有命中強(qiáng)緩存,瀏覽器會(huì)發(fā)送請(qǐng)求到服務(wù)器,請(qǐng)求會(huì)攜帶第一次請(qǐng)求返回的的有關(guān)緩存的header字段信息(last-modified/if-modified-since 和 Etag/if-none-Match),由服務(wù)器根據(jù)請(qǐng)求中相關(guān)header信息來(lái)比對(duì)結(jié)果是否協(xié)商緩存命中,若命中,則服務(wù)器返回新的響應(yīng)header信息更新緩存中的對(duì)應(yīng)header信息,但是并不返回資源內(nèi)容,它會(huì)告知瀏覽器可以直接從緩存獲取,否則返回最新的資源內(nèi)容。
獲取資源形式 狀態(tài)碼 發(fā)送請(qǐng)求到服務(wù)器
強(qiáng)緩存 從緩存取 200(from cache) 否,直接從緩存取
協(xié)商緩存 從緩存取 304(not modified) 是,正如其名,通過(guò)服務(wù)器來(lái)告知緩存是否可用
1 expires,這是http1.0的規(guī)范,它的值為一個(gè)絕對(duì)時(shí)間的GMT格式的時(shí)間字符串,如Mon, 10 Jun 2015 21:31:12 GMT。如果發(fā)送請(qǐng)求的時(shí)間在expires之前,那么本地緩存始終有效,否則就會(huì)發(fā)送請(qǐng)求到服務(wù)器來(lái)獲取資源。
2 cache-control:max-age=number,這是Http1.1時(shí)出現(xiàn)的header信息。主要是利用該字段的max-age值來(lái)進(jìn)行判斷。它是一個(gè)相對(duì)值,資源第一次的請(qǐng)求時(shí)間和cache-control設(shè)定的有效期,計(jì)算出一個(gè)資源過(guò)期時(shí)間。再拿這個(gè)過(guò)期時(shí)間跟當(dāng)前的請(qǐng)求時(shí)間比較,如果請(qǐng)求時(shí)間在過(guò)期時(shí)間之前,就能命中緩存,否則就不行,cache-control除了該字段外,還有下面幾個(gè)比較常用的設(shè)置值。
no-cache : 不使用本地緩存,需要使用協(xié)商緩存。
no-store : 直接禁止瀏覽器緩存數(shù)據(jù)。(強(qiáng)緩存和協(xié)商緩存都不行),每次用戶請(qǐng)求該資源,都會(huì)向服務(wù)器發(fā)送一個(gè)請(qǐng)求,每次都會(huì)下載完整的資源。(常用于銀行等重要業(yè)務(wù))
public : 可以被所有的用戶緩存,包括終端用戶和cdn等中間代理服務(wù)器
private : 只能被終端用戶緩存,不允許CDN等中繼緩存服務(wù)器對(duì)其緩存
注意:如果cache-control與expires同時(shí)存在的話,cache-control的優(yōu)先級(jí)高于expires。
協(xié)商緩存協(xié)商緩存都是由服務(wù)器來(lái)確定緩存資源是否可用的,所以客戶端與服務(wù)器端通過(guò)某種標(biāo)識(shí)進(jìn)行通信,從而讓服務(wù)器判斷請(qǐng)求資源是否可以緩存訪問(wèn),
這里涉及到下面兩組header字段。這兩組搭檔都是成對(duì)出現(xiàn)的,即第一次請(qǐng)求的響應(yīng)頭帶上某個(gè)字段(last-modified或者ETag),則后續(xù)請(qǐng)求則會(huì)帶上對(duì)應(yīng)的請(qǐng)求字段(if-modified-since或者if-none-match),若響應(yīng)頭沒(méi)有l(wèi)ast-modified或者Etag字段,則請(qǐng)求頭也不會(huì)有對(duì)應(yīng)的字段。
1,第一次和服務(wù)器交互,服務(wù)器返回資源 在response的header加上last-modified的header.這個(gè)header表示這個(gè)資源在服務(wù)器上的最后修改時(shí)間
2,第二次請(qǐng)求這個(gè)資源,瀏覽器會(huì)在request header加上if-modified-since的header.這個(gè)header的值就是上一次請(qǐng)求時(shí)返回的last-modified的值。服務(wù)器再次收到資源請(qǐng)求。根據(jù)瀏覽器傳過(guò)來(lái)的if-modified-since和資源在服務(wù)器上的最后修改時(shí)間判斷資源是否有變化,如果沒(méi)有發(fā)生變化則返回
304 not modified .但是不會(huì)返回資源內(nèi)容。如果有變化,就正常返回資源內(nèi)容和更新last-modified字段。當(dāng)服務(wù)器返回304 not modified的響應(yīng)時(shí),response header中不會(huì)再添加last-modified的字段。因?yàn)榧热毁Y源沒(méi)有變化,那么last-modified也就不會(huì)改變.
Etag/if-none-Match
這兩個(gè)值是由服務(wù)器生產(chǎn)的每一個(gè)資源的唯一標(biāo)識(shí)字符串,只要資源有變化就這個(gè)值就會(huì)改變,其判斷過(guò)程和last-modified/if-modified-since類(lèi)似,與last-modified不一樣的是。當(dāng)服務(wù)器返回304 not
modified的響應(yīng) response header中還會(huì)把這個(gè)etag返回,即使這個(gè)eTag跟之前沒(méi)有變化。
**Etag比較的是文件資源的特征值,而Last-Modifield則比較的是文件資源的最后的修改時(shí)間。這兩個(gè)其實(shí)是相輔相成的,不是有了Etag就不該有Last-Modifield,有了Last-Modifield就不該有Etag,同時(shí)傳入服務(wù)器時(shí),服務(wù)器會(huì)根據(jù)自己的緩存機(jī)制進(jìn)行選擇要使用哪個(gè),甚至可以兩個(gè)都進(jìn)行參考
比如img肯定判斷l(xiāng)ast-modified更方便。其他文件可能比較etag更方便
**
你可能會(huì)覺(jué)得使用last-modified已經(jīng)足以讓瀏覽器知道本地的緩存副本是否足夠新,為什么還要Etag呢。http1.1 etag的出現(xiàn)主要是為了解決幾個(gè)last-modifed比較難解決的問(wèn)題:
1 一些文件也行會(huì)周期性的更改,但是他的內(nèi)容并不改變(僅僅改變的修改時(shí)間),這個(gè)時(shí)候我們并不希望客戶端認(rèn)為這個(gè)文件被修改了,而重新GET;
2 某些文件修改非常頻繁,比如在秒以下的時(shí)間內(nèi)進(jìn)行修改(比方說(shuō)1s內(nèi)修改N次)if-modified-since能檢查到的粒度是s級(jí)的,這種修改無(wú)法判斷(unix記錄mtime只能精確到秒)
3 某些服務(wù)器不能精確得到文件的最后修改時(shí)間。
不能緩存的請(qǐng)求文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100264.html
摘要:本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)人總結(jié)給出了比較詳盡的答案。網(wǎng)易阿里騰訊校招社招必備知識(shí)點(diǎn)。此外還有網(wǎng)絡(luò)線程,定時(shí)器任務(wù)線程,文件系統(tǒng)處理線程等等。線程核心是引擎。主線程和工作線程之間的通知機(jī)制叫做事件循環(huán)。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)...
摘要:本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)人總結(jié)給出了比較詳盡的答案。網(wǎng)易阿里騰訊校招社招必備知識(shí)點(diǎn)。此外還有網(wǎng)絡(luò)線程,定時(shí)器任務(wù)線程,文件系統(tǒng)處理線程等等。線程核心是引擎。主線程和工作線程之間的通知機(jī)制叫做事件循環(huán)。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)...
摘要:本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)人總結(jié)給出了比較詳盡的答案。網(wǎng)易阿里騰訊校招社招必備知識(shí)點(diǎn)。此外還有網(wǎng)絡(luò)線程,定時(shí)器任務(wù)線程,文件系統(tǒng)處理線程等等。線程核心是引擎。主線程和工作線程之間的通知機(jī)制叫做事件循環(huán)。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)...
摘要:接下來(lái)的內(nèi)容中我們將通過(guò)緩存位置緩存策略以及實(shí)際場(chǎng)景應(yīng)用緩存策略來(lái)探討瀏覽器緩存機(jī)制。是運(yùn)行在瀏覽器背后的獨(dú)立線程,一般可以用來(lái)實(shí)現(xiàn)緩存功能。在所有瀏覽器緩存中,覆蓋面基本是最大的。 一、前言 緩存可以說(shuō)是性能優(yōu)化中簡(jiǎn)單高效的一種優(yōu)化方式了。一個(gè)優(yōu)秀的緩存策略可以縮短網(wǎng)頁(yè)請(qǐng)求資源的距離,減少延遲,并且由于緩存文件可以重復(fù)利用,還可以減少帶寬,降低網(wǎng)絡(luò)負(fù)荷。對(duì)于一個(gè)數(shù)據(jù)請(qǐng)求來(lái)說(shuō),可以分為...
閱讀 2725·2021-10-08 10:04
閱讀 2764·2021-09-06 15:02
閱讀 883·2019-08-30 13:50
閱讀 1586·2019-08-30 13:21
閱讀 2615·2019-08-30 11:15
閱讀 2156·2019-08-29 17:19
閱讀 1620·2019-08-26 13:55
閱讀 1286·2019-08-26 10:15