標籤:http 發送請求 欄位 還需要 .net ges mon 前端 web應用
緩衝通俗點,就是將已經得到的‘東東’存放在一個相對於自己而言,儘可能近的地方,以便下次需要時,不會再二筆地跑到起始點(很遠的地方)去擷取,而是就近解決,從而縮短時間和節約金錢(坐車要錢嘛)。Web緩衝,也是同樣的道理,說白了,就是當你第一次訪問網址時,將這個東東(representations),如html頁面、圖片、JavaScript檔案等,存在一個離你較近的地方,當你下次還需要它時,不用再一次跋山涉水到伺服器(origin servers)去擷取。繼而,web緩衝的優勢也就很明顯了:
1、 減少了網路延遲,加快了頁面響應速度,增強了使用者體驗嘛。(因為我是就近擷取的,路程縮短了,所以響應速度當然比到遙遠的伺服器去擷取快哦);
2、 減少了網路頻寬消耗嘛。(就近擷取);
3、 通過緩衝,我們都不用到伺服器 (origin servers)去請求了,從而也就相應地減輕了伺服器的壓力。
那web緩衝將這些東東放在哪兒呢?下面我就看看有哪些緩衝種類,從而瞭解放在哪吧。
--資料庫緩衝--:
當web應用關係複雜,資料表蹭蹭蹭往上漲時,可以將查詢後的資料放到記憶體中進行緩衝,下次再查詢時,就直接從記憶體緩衝中擷取,從而提高響應速度。
--CDN緩衝--:
CDN通俗點,就是當我們發送一個web請求時,會先經過它一道手,然後它幫我們計算路徑,去哪得到這些東東(representations)的路徑短且快。這個是網站管理員部署的,所以他們也可以將大家經常訪問的representations放在CDN裡,這樣,就響應就更快了。
--Proxy 伺服器緩衝--:
Proxy 伺服器緩衝,其實跟下面即將講的瀏覽器緩衝性質差不多,差別就是Proxy 伺服器緩衝面向的群體更廣,規模更大而已。即,它不只為一個使用者服務,一般為大量使用者提供服務,同一個副本會被重用多次,因此在減少相應時間和頻寬使用方面很有效。
--瀏覽器緩衝--:
簡而言之,就是,每個瀏覽器都實現了 HTTP 緩衝,我們通過瀏覽器使用HTTP協議與伺服器互動的時候,瀏覽器就會根據一套與伺服器約定的規則進行緩衝工作。當我們點擊瀏覽器上‘後退’或者‘前進’按鈕時,顯得特別有用。
所謂機制就是一些雙方的約定,清晰地告訴對方,什麼時候該做什麼事。web緩衝也一樣,你總得告訴我(請求)什麼時候到緩衝中去擷取,什麼到伺服器去擷取representations吧。So,也得有一套相應的機制,web 緩衝機制分為兩大部分http協議(HTTP1.0和HTTP1.1)和網站管理員制定的協議。拋開網站內部制定的協議,我們來看看http協議中定義的緩衝機制。
By the way,我們可以在HTML文檔中的<head>中通過<meta>來緩衝,如下:
<meta http-equiv="Pragma" content="no-cache"/>
但,它只有部分瀏覽器可以用,並且Proxy 伺服器也不會鳥它。(因為meta在html中,Proxy 伺服器幾乎不回去讀它滴)。
--http緩衝機制--
1、 Expires
http緩衝機制主要在http回應標頭中設定,回應標頭中相關欄位為Expires、Cache-Control、Last-Modified、If-Modified-Since、Etag。
HTTP 1.0協議中的。簡而言之,就是告訴瀏覽器在約定的這個時間前,可以直接從緩衝中擷取資源(representations),而無需跑到伺服器去擷取。
另:Expires因為是對時間設定的,且時間是Greenwich Mean Time (GMT),而不是本地時間,所以對時間要求較高。
2、 Cache-Control
HTTP1.1協議中的,因為有了它,所以可以忽略上面提到的Expires。因為Cache-Control相對於Expires更加具體,細緻。
且,就算同時設定了Cache-Control和Expires,Cache-Control的優先順序也高於Expires。
下面就來看看,Cache-Control回應標頭中常用欄位的具體含義:
(1)、max-age:用來設定資源(representations)可以被緩衝多長時間,單位為秒;
(2)、s-maxage:和max-age是一樣的,不過它只針對Proxy 伺服器緩衝而言;
(3)、public:指示響應可被任何緩衝區緩衝;
(4)、private:只能針對個人使用者,而不能被Proxy 伺服器緩衝;
(5)、no-cache:強制用戶端直接向伺服器發送請求,也就是說每次請求都必須向伺服器發送。伺服器接收到請求,然後判斷資源是否變更,是則返回新內容,否則返回304,未變更。這個很容易讓人產生誤解,使人誤以為是響應不被緩衝。實際上Cache-Control: no-cache是會被緩衝的,只不過每次在向用戶端(瀏覽器)提供響應資料時,緩衝都要向伺服器評估緩衝響應的有效性。
(6)、no-store:禁止一切緩衝(這個才是響應不被緩衝的意思)。
3、 Etag & If-None-Match
HTTP/1.1 200 OKDate: Fri, 30 Oct 1998 13:19:41 GMTServer: Apache/1.3.3 (Unix)Cache-Control: max-age=3600, must-revalidateExpires: Fri, 30 Oct 1998 14:19:41 GMTLast-Modified: Mon, 29 Jun 1998 02:28:12 GMTETag: "3e86-410-3596fbbc"Content-Length: 1040Content-Type: text/html
Etag是屬於HTTP 1.1屬性,它是由伺服器產生返回給前端,
當你第一次發起HTTP請求時,伺服器會返回一個Etag,
並在你第二次發起同一個請求時,用戶端會同時發送一個If-None-Match,而它的值就是Etag的值(此處由發起請求的用戶端來設定)。
然後,伺服器會比對這個客服端發送過來的Etag是否與伺服器的相同,
如果相同,就將If-None-Match的值設為false,返回狀態為304,用戶端繼續使用本機快取,不解析伺服器返回的資料(這種情境伺服器也不返回資料,因為伺服器的資料沒有變化嘛)
如果不相同,就將If-None-Match的值設為true,返回狀態為200,用戶端重新解析伺服器返回的資料
說白了,Etag就是伺服器產生的一個標記而已。
且Etag的優先順序高於Last-Modified。
4、 Last-Modified & If-Modified-Since
Last-Modified與Etag類似。不過Last-Modified表示響應資源在伺服器最後修改時間而已。與Etag相比,不足為:
(1)、Last-Modified標註的最後修改只能精確到秒級,如果某些檔案在1秒鐘以內,被修改多次的話,它將不能準確標註檔案的修改時間;
(2)、如果某些檔案會被定期產生,當有時內容並沒有任何變化,但Last-Modified卻改變了,導致檔案沒法使用緩衝;
(3)、有可能存在伺服器沒有準確擷取檔案修改時間,或者與Proxy 伺服器時間不一致等情形。
然而,Etag是伺服器自動產生或者由開發人員產生的對應資源在伺服器端的唯一識別碼,能夠更加準確的控制緩衝。
[1]、"Caching Tutorial"
Web緩衝雜談--Etag & If-None-Match