總所周知,快取是解決http1.1
協議傳輸效能的問題中最主要的手段。
快取既可以存在於瀏覽器上,也可以存在於伺服器中。
而影響快取的http
頭部有很多,其中cache-control
是比較重要的乙個,也是取值比較複雜的乙個。
下面先聊一聊快取的工作原理,再說說cache-control
的詳細取值。
http
快取是乙個以時間為維度的快取。
瀏覽器在第一次請求中快取了響應,而後續的請求可以從快取提取第一次請求的響應。從而達到:減少時延而且還能降低頻寬消耗,因為可能壓根就沒有發出請求,所以網路的吞吐量也下降了。
瀏覽器發出第一次請求,伺服器返回響應。如果得到響應中有資訊告訴瀏覽器可以快取此響應。那麼瀏覽器就把這個響應快取到瀏覽器快取中。
如果後續再發出請求時,瀏覽器會先判斷快取是否過期。如果沒有過期,瀏覽器壓根就不會向伺服器發出請求,而是直接從快取中提取結果。
比如:訪問掘金站點
從size
中可以看出,disk cache
是從硬碟中提取的快取資訊。
如果快取過期了,也並不一定向第乙個請求那樣伺服器直接返回響應。
瀏覽器的快取時間過過期了,就把該請求帶上快取的標籤傳送給伺服器。這時如果伺服器覺得這份快取還能用,那就返回304響應碼。瀏覽器將繼續使用這份快取。
比如:選擇上面圖中的其中乙份快取檔案,copy
請求url
在curl
中展示
首先加-i
獲取原始請求,檢視etag
或last-modified
頭部。
因為瀏覽器快取過期之後,請求就會帶上這些頭部一起傳送給伺服器,讓伺服器判斷是否還能用。
針對etag
頭部,加乙個if-none-match
頭部帶上etag
的值詢問伺服器。當然也可以針對last-modified
頭部,加乙個if-modified-since
頭部詢問。
返回的是304。304的好處就是不攜帶包體,也就是說content-length
為0,這樣就節省了大量的頻寬。
瀏覽器快取是私有快取,只提供給乙個使用者使用的。
怎麼分辨這個資源是**伺服器的快取還是源伺服器傳送的呢?
仍然使用掘金的例子
從圖中看出這個請求的response headers
中的age
頭部,單位是秒。
說明這個快取是共享快取返回的,age
說明了它在共享快取存在的時間,圖中是327784,也就是在共享快取中存在了327784秒。
共享快取也有過期的時候,下面看看共享快取的工作原理。
如圖所示:
1、當client1
發起請求時,cache
也就是**伺服器(共享快取),**這條請求給源伺服器。源伺服器返回響應,並在cache-control
頭部中設定可以快取100秒。接著在cache
中就會開啟乙個定時器age
,將響應帶上age:0
頭部返回給client1
。
2、過了10秒後,client2
傳送相同的請求,cache
中的快取還沒有過期,就帶上age:10
頭部返回快取中的響應給client2
。
3、過了100秒後,client3
傳送同樣的請求,這時cache
中的快取已經過期了,就像前面說到那樣用條件請求頭部if-none-match
帶上快取的指紋發給源伺服器。當源服務認為此快取還能用,就返回304狀態碼給cache
。cache
就重新計時,從快取中找出響應帶上age:0
頭部返回給client3
。
vary
頭部是可以做一些更為複雜的快取匹配條件,只有vary
頭部指定的頭部必須與請求中的頭部相匹配才能使用快取。
vary
的定義:
如圖所示:
1、 當client1
攜帶accept-encoding:*
頭部的get
請求傳送給server
。server
返回的是gzip
編碼的響應,以及vary:content-encoding
頭部,表示著編碼方式一樣的時候才能使用快取。
2、當client2
攜帶accept-encoding:br
頭部的get
請求傳送給server
,這時請求的是br
編碼。所以cache
不能使用快取,因為不匹配vary
的中的值,只能**請求給源伺服器server
。
3、當client3
攜帶accept-encoding:br
頭部的get
請求傳送給server
,這時cache
有br
編碼的快取,能匹配vary
頭部的值,所以能使用快取返回。
cache-control
頭部取值範圍非常複雜。
cache-control
的定義是:
cache-control
既可以在請求中使用,也可以在響應是使用。而且相同的值在請求和響應中的含義是不一樣的。
cache-control
值有三種用法:
在請求中cache-control
的取值、用法及其含義:@後面表示第幾種用法
在響應中cache-control
的取值及其含義:
MVP, MVC, MVVM, 傻傻分不清楚
最近 mvc model view controller 和 mvvm model view viewmodel 在微軟圈成為顯學,asp.net mvc 和 wpf 的 prism mvvm framework 功不可沒,mvc 和 mvvm 在概念上都是基於分層的,將呈現 presentatio...
物件,陣列,傻傻分不清楚
有段時間寫 總將物件和陣列區分不開,當然,可能是我的基礎不太紮實吧,今天將單獨將物件和陣列拿出來溜溜。首先來說一下物件,作為乙個沒有物件的人,這時候就需要用js來自己new乙個物件了 1.物件 object 什麼是物件?物件是一種引用型別,物件的值就是引用型別的例項。建立物件的方法?1 new乙個物...
併發 並行傻傻分不清楚?
今天,我們正在解決乙個問題 同時的,同時的愚蠢的困惑?執行緒在其生命週期中經歷了什麼?知識給你解答生活中所有困難的問題。concurrent和parallel 併發是指在一定時間內,多工交替處理的能力。並行性是指同時處理多個任務的能力。案例 當乙個商場的銷售員需要面對許多顧客時,有些顧客要求 有些顧...