用了兩天的業(yè)余時(shí)間,研究了一下緩存的事情,不敢說(shuō)完全掌握,還是把找的相關(guān)資料按照自己的理解整理一下~以供學(xué)習(xí),俗話(huà)說(shuō),好腦子不如爛筆頭,跟哪位前輩的重復(fù)了,歡迎批評(píng)指導(dǎo),話(huà)不說(shuō)多,步入正題

  我們說(shuō)的緩存指的是可以自動(dòng)保存常見(jiàn)http請(qǐng)求副本的http設(shè)備,有了緩存,我們便可以從本地(瀏覽器)獲取,而不需要在從服務(wù)器端更新了;

  緩存的分類(lèi),網(wǎng)上眾說(shuō)紛紜,但是大致有以下幾:,瀏覽器緩存,CDN緩存,數(shù)據(jù)庫(kù)緩存,代理服務(wù)器緩存;但本文說(shuō)的是瀏覽器緩存.

  `我們有時(shí)候有個(gè)明顯的感覺(jué)就是,打開(kāi)某個(gè)網(wǎng)站的時(shí)候,第一次會(huì)感覺(jué)慢和卡,第二次會(huì)快得多;當(dāng)然,沒(méi)有感覺(jué)到的話(huà),也可能是網(wǎng)速比較好,感覺(jué)到了就是緩存再起作用,第一次請(qǐng)求的時(shí)候,下載的數(shù)據(jù)比較多,第二次往后有緩存(本地副本),就會(huì)節(jié)約響應(yīng)時(shí)間,

  下面列舉一下使用緩存(本文指的是瀏覽器緩存,下文不在贅述)的優(yōu)點(diǎn):

  1,對(duì)用戶(hù)來(lái)說(shuō),節(jié)約流量,提高了體驗(yàn)性能

  2,對(duì)網(wǎng)站開(kāi)發(fā)來(lái)說(shuō),節(jié)省帶寬,減少冗余的數(shù)據(jù)傳輸,另一方面,也降低服務(wù)器的壓力

一,緩存的示意圖如下:

  第一次請(qǐng)求的時(shí)候是這樣的

 

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

也不需要過(guò)多的解釋了,畢竟第一次,啥都要從服務(wù)器端獲取

2.以后的請(qǐng)求如下圖所示

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

對(duì)著流程簡(jiǎn)單說(shuō)一下,首先會(huì)判斷是否有緩存,沒(méi)有的話(huà),跟第一次一樣,去服務(wù)器獲取;

  有的情況下,就要判斷緩存時(shí)間是否過(guò)期,過(guò)期了,還要到服務(wù)器獲取,

  沒(méi)有過(guò)期,執(zhí)行接下來(lái)的一步,向服務(wù)器發(fā)送帶有If-None-Match,判斷返回的值和ETag是否相等,相等,說(shuō)明可用緩存,

  不相等,向服務(wù)器發(fā)送帶有Ih-Modified-Since,判斷和Last-Modified(最后修改時(shí)間)兩者的時(shí)間大小,在決定是使用緩存還是更新.看的懵逼沒(méi)事,先記住大概流程,接下來(lái)一一講解

二.相關(guān)名詞解釋

1.如何判斷時(shí)候過(guò)期

  原來(lái)用的是Expires策略,瀏覽器可以直接從瀏覽器緩存讀取數(shù)據(jù),而無(wú)需再次請(qǐng)求,它的值對(duì)應(yīng)一個(gè)GMT,來(lái)告訴瀏覽器資源緩存過(guò)期時(shí)間,如果還沒(méi)過(guò)該時(shí)間點(diǎn)則不發(fā)請(qǐng)求。

  例如下面的例子,這是京東的首頁(yè)里找的一個(gè),時(shí)間都干到2027年了,現(xiàn)在的時(shí)間是2017年7月20,肯定還沒(méi)到失效時(shí)間,so是304,使用本地緩存,也就是說(shuō)在失效時(shí)間之內(nèi),一直使用緩存,除非把緩存刪了photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

但是這是http1.0的東西,現(xiàn)在使用的是http1.1的,這個(gè)可以忽略了因?yàn)檫@個(gè)是獲取的本地的時(shí)間,我們改動(dòng)的話(huà),會(huì)出現(xiàn)問(wèn)題,現(xiàn)在都用Cache-control了

   cache-control策略有的地方也叫新鮮度限值

這個(gè)和上面說(shuō)的expires效果是一樣的,最大時(shí)間,

用來(lái)控制瀏覽器是否直接從瀏覽器緩存取數(shù)據(jù)還是重新發(fā)請(qǐng)求到服務(wù)器取數(shù)據(jù)。

只不過(guò)Cache-Control的選擇更多,設(shè)置更細(xì)致,如果同時(shí)設(shè)置的話(huà),其優(yōu)先級(jí)高于Expires。

Cache-Control可擁有如下值:


Public
指定響應(yīng)會(huì)被緩存,并且在多用戶(hù)間共享。

Private
響應(yīng)只作為私有的緩存(見(jiàn)下圖),不能在用戶(hù)間共享。如果要求HTTP認(rèn)證,響應(yīng)會(huì)自動(dòng)設(shè)置為private。。緩存只開(kāi)放給某些特定的用戶(hù),比如服務(wù)器的用戶(hù),其他用戶(hù)則不能緩存這些數(shù)據(jù)。

no-cache
指定不緩存響應(yīng),表明資源不進(jìn)行緩存,

no-store
用于防止重要的信息被無(wú)意的發(fā)布。在請(qǐng)求消息中發(fā)送將使得請(qǐng)求和響應(yīng)消息都不使用緩存,完全不存下來(lái)。

max-age
指示客戶(hù)端該端時(shí)間內(nèi)緩存都是最新的。單位為秒,就是在這個(gè)時(shí)間內(nèi),不會(huì)請(qǐng)求數(shù)據(jù)了,一直用的就是緩存。比如:Cache-Control:max-age=3600 表示60分鐘之后過(guò)期,在這60分鐘期間不會(huì)更新。

min-fresh 
指示客戶(hù)端希望獲取一個(gè)在小于指定的時(shí)間內(nèi)被更新過(guò)的資源,單位為秒:例如:Cache-Control:min-fresh =120 。向服務(wù)器獲取2分鐘內(nèi)被更新過(guò)的資源

max-stale
指示客戶(hù)端可以接收超出超時(shí)期間的響應(yīng)消息。例如:Cache-Control:max-stale =3600 ,向服務(wù)器獲取超過(guò)緩存時(shí)間2分鐘的資源..

2.Etag和If-None-Match

下面說(shuō)的東西,包括Etag和If-None-Match,是在緩存時(shí)間已經(jīng)失效的情況下,即Cache-Control:mac-age = 0 的情況下,

會(huì)判斷Etag和If-None-Match兩者是否相等,ETag是根據(jù)實(shí)體內(nèi)容生成的hash字符串,具體是對(duì)文件的索引節(jié)(INode),大?。⊿ize)和最后修改時(shí)間(MTime)進(jìn)行Hash后得到的,

如果If-None-Match返回的和Etag相等的話(huà),就返回304,可以使用緩存的資源,文件沒(méi)有被改動(dòng).具體如下

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

3.Last-Modified和If-Modified-Since

在多說(shuō)一下,這個(gè)也是在緩存時(shí)間已經(jīng)失效,即Cache-Control:mac-age = 0 的情況下,而且上面的Etag和If-None-Match不相等的情況下;

  Last-Modified指的是文件上一次被修改的時(shí)間(可以理解為服務(wù)器端的),, 會(huì)帶著 If-Modified-Since(本地的)返回的時(shí)間,,本地的時(shí)間大于等于服務(wù)器端的時(shí)間的花,說(shuō)明資源沒(méi)有被改動(dòng)過(guò)接著用緩存的,否則就要更新,從新發(fā)送web請(qǐng)求了,如果感覺(jué)拗口的話(huà),貼一下參考的原話(huà),

 

當(dāng)資源過(guò)期時(shí)(也就是 Cache-Control:max-age=0,),發(fā)現(xiàn)資源具有Last-Modified聲明,則再次向web服務(wù)器請(qǐng)求時(shí)帶上頭 If-Modified-Since,表示請(qǐng)求時(shí)間。web服

務(wù)器收到請(qǐng)求后發(fā)現(xiàn)有頭If-Modified-Since 則與被請(qǐng)求資源的最后修改時(shí)間進(jìn)行比對(duì)。若Last-Modified的時(shí)間較新,說(shuō)明最后修改時(shí)間較新,說(shuō)明資源又被改動(dòng)過(guò),則響應(yīng)整

的資源重新從服務(wù)器讀取,而不是讀取緩存,返回200狀態(tài)嗎;若If-Modified-Since的時(shí)間比Last-Modified新或者相等,說(shuō)明服務(wù)器的內(nèi)容沒(méi)有更新,直接讀取緩存即可,

返回304狀態(tài)碼,告知瀏覽器繼續(xù)使用所保存的cache。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

 

 

另外需要說(shuō)明的是: cache-control      .Etag和If-None-Match   Etag和If-None-Match三者的權(quán)重是從左到右越來(lái)越小的;

還有一點(diǎn)需要說(shuō)明的是,我們說(shuō)的緩存~基本上都是GET方式的,像POST之類(lèi)的通常情況下是不會(huì)進(jìn)行緩存的;

  說(shuō)了這么多,緩存是好的,可以節(jié)約資源,減少服務(wù)器的壓力,但是,設(shè)置太長(zhǎng)的緩存時(shí)間的話(huà),又不能及時(shí)的更新資源,具體如何取舍把握,還要視具體情況再說(shuō).

 

http://www.cnblogs.com/wfqjcq/p/7215358.html