国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

http協(xié)商緩存VS強(qiáng)緩存

fancyLuo / 2602人閱讀

摘要:本文主要講解瀏覽器端的緩存,緩存的作用是不言而喻的,能夠極大的改善網(wǎng)頁(yè)性能,提高用戶體驗(yàn)。只能被終端用戶的瀏覽器緩存,不允許等中繼緩存服務(wù)器對(duì)其緩存。

之前一直對(duì)瀏覽器緩存只能描述一個(gè)大概,深層次的原理不能描述上來(lái);終于在前端的兩次面試過(guò)程中被問(wèn)倒下,為了泄恨,查閱一些資料最終對(duì)其有了一個(gè)更深入的理解,廢話不多說(shuō),趕緊來(lái)看看瀏覽器緩存的那些事吧,有不對(duì)的地方,請(qǐng)各位不吝賜教啊。

本文主要講解瀏覽器端的緩存,緩存的作用是不言而喻的,能夠極大的改善網(wǎng)頁(yè)性能,提高用戶體驗(yàn)。

1、瀏覽器緩存
緩存這東西,第一次必須獲取到資源后,然后根據(jù)返回的信息來(lái)告訴如何緩存資源,可能采用的是強(qiáng)緩存,也可能告訴客戶端瀏覽器是協(xié)商緩存,這都需要根據(jù)響應(yīng)的header內(nèi)容來(lái)決定的。下面用兩幅圖來(lái)描述瀏覽器的緩存是怎么玩的,讓大家有個(gè)大概的認(rèn)知。

瀏覽器第一次請(qǐng)求時(shí):

瀏覽器后續(xù)在進(jìn)行請(qǐng)求時(shí):

從上圖可以知道,瀏覽器緩存包含兩種類型,即強(qiáng)緩存(也叫本地緩存)和協(xié)商緩存,瀏覽器在第一次請(qǐng)求發(fā)生后,再次請(qǐng)求時(shí):

瀏覽器在請(qǐng)求某一資源時(shí),會(huì)先獲取該資源緩存的header信息,判斷是否命中強(qiáng)緩存(cache-control和expires信息),若命中直接從緩存中獲取資源信息,包括緩存header信息;本次請(qǐng)求根本就不會(huì)與服務(wù)器進(jìn)行通信;在firebug下可以查看某個(gè)具有強(qiáng)緩存資源返回的信息,例如本地firebug查看的一個(gè)強(qiáng)緩存js文件

如果沒(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)容
強(qiáng)緩存與協(xié)商緩存的區(qū)別,可以用下表來(lái)進(jìn)行描述:

 獲取資源形式    狀態(tài)碼    發(fā)送請(qǐng)求到服務(wù)器

強(qiáng)緩存 從緩存取 200(from cache) 否,直接從緩存取
協(xié)商緩存 從緩存取 304(not modified) 是,正如其名,通過(guò)服務(wù)器來(lái)告知緩存是否可用

2、強(qiáng)緩存相關(guān)的header字段
強(qiáng)緩存上面已經(jīng)介紹了,直接從緩存中獲取資源而不經(jīng)過(guò)服務(wù)器;與強(qiáng)緩存相關(guān)的header字段有兩個(gè):

expires,這是http1.0時(shí)的規(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)獲取資源

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é)商,先與服務(wù)器確認(rèn)返回的響應(yīng)是否被更改,如果之前的響應(yīng)中存在ETag,那么請(qǐng)求的時(shí)候會(huì)與服務(wù)端驗(yàn)證,如果資源未被更改,則可以避免重新下載。

no-store:直接禁止游覽器緩存數(shù)據(jù),每次用戶請(qǐng)求該資源,都會(huì)向服務(wù)器發(fā)送一個(gè)請(qǐng)求,每次都會(huì)下載完整的資源。

public:可以被所有的用戶緩存,包括終端用戶和CDN等中間代理服務(wù)器。

private:只能被終端用戶的瀏覽器緩存,不允許CDN等中繼緩存服務(wù)器對(duì)其緩存。
  注意:如果cache-control與expires同時(shí)存在的話,cache-control的優(yōu)先級(jí)高于expires

3、協(xié)商緩存相關(guān)的header字段
協(xié)商緩存都是由服務(wù)器來(lái)確定緩存資源是否可用的,所以客戶端與服務(wù)器端要通過(guò)某種標(biāo)識(shí)來(lái)進(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)有Last-Modified或者Etag字段,則請(qǐng)求頭也不會(huì)有對(duì)應(yīng)的字段。

Last-Modified/If-Modified-Since
二者的值都是GMT格式的時(shí)間字符串,具體過(guò)程:
瀏覽器第一次跟服務(wù)器請(qǐng)求一個(gè)資源,服務(wù)器在返回這個(gè)資源的同時(shí),在respone的header加上Last-Modified的header,這個(gè)header表示這個(gè)資源在服務(wù)器上的最后修改時(shí)間

瀏覽器再次跟服務(wù)器請(qǐng)求這個(gè)資源時(shí),在request的header上加上If-Modified-Since的header,這個(gè)header的值就是上一次請(qǐng)求時(shí)返回的Last-Modified的值

服務(wù)器再次收到資源請(qǐng)求時(shí),根據(jù)瀏覽器傳過(guò)來(lái)If-Modified-Since和資源在服務(wù)器上的最后修改時(shí)間判斷資源是否有變化,如果沒(méi)有變化則返回304 Not Modified,但是不會(huì)返回資源內(nèi)容;如果有變化,就正常返回資源內(nèi)容。當(dāng)服務(wù)器返回304 Not Modified的響應(yīng)時(shí),response header中不會(huì)再添加Last-Modified的header,因?yàn)榧热毁Y源沒(méi)有變化,那么Last-Modified也就不會(huì)改變,這是服務(wù)器返回304時(shí)的response header

瀏覽器收到304的響應(yīng)后,就會(huì)從緩存中加載資源

如果協(xié)商緩存沒(méi)有命中,瀏覽器直接從服務(wù)器加載資源時(shí),Last-Modified的Header在重新加載的時(shí)候會(huì)被更新,下次請(qǐng)求時(shí),If-Modified-Since會(huì)啟用上次返回的Last-Modified值

Etag/If-None-Match
這兩個(gè)值是由服務(wù)器生成的每個(gè)資源的唯一標(biāo)識(shí)字符串,只要資源有變化就這個(gè)值就會(huì)改變;其判斷過(guò)程與Last-Modified/If-Modified-Since類似,與Last-Modified不一樣的是,當(dāng)服務(wù)器返回304 Not Modified的響應(yīng)時(shí),由于ETag重新生成過(guò),response header中還會(huì)把這個(gè)ETag返回,即使這個(gè)ETag跟之前的沒(méi)有變化。

 4、既生Last-Modified何生Etag
  你可能會(huì)覺(jué)得使用Last-Modified已經(jīng)足以讓瀏覽器知道本地的緩存副本是否足夠新,為什么還需要Etag呢?HTTP1.1中Etag的出現(xiàn)主要是為了解決幾個(gè)Last-Modified比較難解決的問(wèn)題:
一些文件也許會(huì)周期性的更改,但是他的內(nèi)容并不改變(僅僅改變的修改時(shí)間),這個(gè)時(shí)候我們并不希望客戶端認(rèn)為這個(gè)文件被修改了,而重新GET;

某些文件修改非常頻繁,比如在秒以下的時(shí)間內(nèi)進(jìn)行修改,(比方說(shuō)1s內(nèi)修改了N次),If-Modified-Since能檢查到的粒度是s級(jí)的,這種修改無(wú)法判斷(或者說(shuō)UNIX記錄MTIME只能精確到秒);

某些服務(wù)器不能精確的得到文件的最后修改時(shí)間。

這時(shí),利用Etag能夠更加準(zhǔn)確的控制緩存,因?yàn)镋tag是服務(wù)器自動(dòng)生成或者由開(kāi)發(fā)者生成的對(duì)應(yīng)資源在服務(wù)器端的唯一標(biāo)識(shí)符。

Last-Modified與ETag是可以一起使用的,服務(wù)器會(huì)優(yōu)先驗(yàn)證ETag,一致的情況下,才會(huì)繼續(xù)比對(duì)Last-Modified,最后才決定是否返回304。

5、用戶的行為對(duì)緩存的影響
盜用網(wǎng)上的一張圖,基本能描述用戶行為對(duì)緩存的影響

6、強(qiáng)緩存如何重新加載緩存緩存過(guò)的資源
上面說(shuō)到,使用強(qiáng)緩存時(shí),瀏覽器不會(huì)發(fā)送請(qǐng)求到服務(wù)端,根據(jù)設(shè)置的緩存時(shí)間瀏覽器一直從緩存中獲取資源,在這期間若資源產(chǎn)生了變化,瀏覽器就在緩存期內(nèi)就一直得不到最新的資源,那么如何防止這種事情發(fā)生呢?

通過(guò)更新頁(yè)面中引用的資源路徑,讓瀏覽器主動(dòng)放棄緩存,加載新資源。

類似下圖所示:

這樣每次文件改變后就會(huì)生成新的query值,這樣query值不同,也就是頁(yè)面引用的資源路徑不同了,之前緩存過(guò)的資源就被瀏覽器忽略了,因?yàn)橘Y源請(qǐng)求的路徑變了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/53889.html

相關(guān)文章

  • http協(xié)商緩存VS強(qiáng)緩存

    摘要:本文主要講解瀏覽器端的緩存,緩存的作用是不言而喻的,能夠極大的改善網(wǎng)頁(yè)性能,提高用戶體驗(yàn)。只能被終端用戶的瀏覽器緩存,不允許等中繼緩存服務(wù)器對(duì)其緩存。 之前一直對(duì)瀏覽器緩存只能描述一個(gè)大概,深層次的原理不能描述上來(lái);終于在前端的兩次面試過(guò)程中被問(wèn)倒下,為了泄恨,查閱一些資料最終對(duì)其有了一個(gè)更深入的理解,廢話不多說(shuō),趕緊來(lái)看看瀏覽器緩存的那些事吧,有不對(duì)的地方,請(qǐng)各位不吝賜教啊。 本文主...

    wfc_666 評(píng)論0 收藏0
  • 一張圖理解Http緩存

    摘要:用戶發(fā)起了一個(gè)請(qǐng)求后,瀏覽器發(fā)現(xiàn)先本地已有所請(qǐng)求資源的緩存,便開(kāi)始檢查緩存是否過(guò)期。表明只有特定用戶才能使用緩存,適用于公共緩存服務(wù)器的情況。用戶行為最后附一張圖說(shuō)明用戶行為對(duì)瀏覽器緩存的影響 參閱了一些瀏覽器緩存的資料,本文通過(guò)一張圖來(lái)歸納總結(jié)其過(guò)程。 瀏覽器第一次向一個(gè)web服務(wù)器發(fā)起http請(qǐng)求后,服務(wù)器會(huì)返回請(qǐng)求的資源,并且在響應(yīng)頭中添加一些有關(guān)緩存的字段如:Cache-Con...

    劉永祥 評(píng)論0 收藏0
  • 詳解web緩存

    摘要:指示對(duì)于單個(gè)用戶的整個(gè)或部分響應(yīng)消息,不能被共享緩存處理。參考文章瀏覽器協(xié)議緩存機(jī)制詳解的實(shí)現(xiàn)原理寫(xiě)給后端程序員的緩存原理介紹 說(shuō)說(shuō)web緩存 網(wǎng)上關(guān)于WEB緩存的文章很多,今天匯總一下。 為什么要用緩存 一般針對(duì)靜態(tài)資源如CSS,JS,圖片等使用緩存,原因如下: 請(qǐng)求更快:通過(guò)將內(nèi)容緩存在本地瀏覽器或距離最近的緩存服務(wù)器(如CDN),在不影響網(wǎng)站交互的前提下可以大大加快網(wǎng)站加載速度...

    ACb0y 評(píng)論0 收藏0
  • 網(wǎng)絡(luò)篇—瀏覽器緩存(一)

    摘要:當(dāng)值設(shè)為時(shí),則代表在這個(gè)請(qǐng)求正確返回時(shí)間瀏覽器也會(huì)記錄下來(lái)的分鐘內(nèi)再次加載資源,就會(huì)命中強(qiáng)緩存。 網(wǎng)絡(luò)篇—瀏覽器緩存(一) 一、緩存類型 有兩種,強(qiáng)緩存和協(xié)商緩存 強(qiáng)緩存 不會(huì)向服務(wù)器發(fā)送請(qǐng)求,直接從緩存中讀取資源; 協(xié)商緩存 向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器會(huì)根據(jù)這個(gè)請(qǐng)求的request header的一些參數(shù)來(lái)判斷是否命中協(xié)商緩存,如果命中,則返回304狀態(tài)碼并帶上新的respon...

    CatalpaFlat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<