URI與URL傻傻分不清楚?

2021-10-25 08:37:43 字數 3326 閱讀 4925

總所周知,快取是解決http1.1協議傳輸效能的問題中最主要的手段。

快取既可以存在於瀏覽器上,也可以存在於伺服器中。

而影響快取的http頭部有很多,其中cache-control是比較重要的乙個,也是取值比較複雜的乙個。

下面先聊一聊快取的工作原理,再說說cache-control的詳細取值。

http快取是乙個以時間為維度的快取。

瀏覽器在第一次請求中快取了響應,而後續的請求可以從快取提取第一次請求的響應。從而達到:減少時延而且還能降低頻寬消耗,因為可能壓根就沒有發出請求,所以網路的吞吐量也下降了。

瀏覽器發出第一次請求,伺服器返回響應。如果得到響應中有資訊告訴瀏覽器可以快取此響應。那麼瀏覽器就把這個響應快取到瀏覽器快取中。

如果後續再發出請求時,瀏覽器會先判斷快取是否過期。如果沒有過期,瀏覽器壓根就不會向伺服器發出請求,而是直接從快取中提取結果。

比如:訪問掘金站點

size中可以看出,disk cache是從硬碟中提取的快取資訊。

如果快取過期了,也並不一定向第乙個請求那樣伺服器直接返回響應。

瀏覽器的快取時間過過期了,就把該請求帶上快取的標籤傳送給伺服器。這時如果伺服器覺得這份快取還能用,那就返回304響應碼。瀏覽器將繼續使用這份快取。

比如:選擇上面圖中的其中乙份快取檔案,copy請求urlcurl中展示

首先加-i獲取原始請求,檢視etaglast-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狀態碼給cachecache就重新計時,從快取中找出響應帶上age:0頭部返回給client3

vary頭部是可以做一些更為複雜的快取匹配條件,只有vary頭部指定的頭部必須與請求中的頭部相匹配才能使用快取。

vary的定義:

如圖所示:

1、 當client1攜帶accept-encoding:*頭部的get請求傳送給serverserver返回的是gzip編碼的響應,以及vary:content-encoding頭部,表示著編碼方式一樣的時候才能使用快取。

2、當client2攜帶accept-encoding:br頭部的get請求傳送給server,這時請求的是br編碼。所以cache不能使用快取,因為不匹配vary的中的值,只能**請求給源伺服器server

3、當client3攜帶accept-encoding:br頭部的get請求傳送給server,這時cachebr編碼的快取,能匹配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 併發是指在一定時間內,多工交替處理的能力。並行性是指同時處理多個任務的能力。案例 當乙個商場的銷售員需要面對許多顧客時,有些顧客要求 有些顧...