標籤:速度 文檔 常用 協議 屬性 max 儲存 memcached 導航
在web開發過程中,緩衝是老生常談的一個話題。本文從緩衝的定義、作用、分類、機制等方面介紹http緩衝及其原理。希望能對大家有所協助,如有紕漏,還請提出指正。
什麼是web緩衝
根據MDN上的解釋,緩衝是指儲存指定資源的一份拷貝,並在下次請求該資源的時候提供這份拷貝而非源檔案的技術。當 web 緩衝發現請求的資源已經被儲存,它會攔截請求,返回該資源的拷貝,而不會去原始伺服器重新下載。
緩衝的作用
1、減少網路頻寬消耗,降低運營成本
2、降低伺服器壓力。給網路資源設定有效期間之後,使用者可以重複使用本地的緩衝,減少對原始伺服器的請求,間接降低伺服器的壓力。同時,搜尋引擎的爬蟲機器人也能根據到期機制降低爬取的頻率,也能有效降低伺服器的壓力
3、減少網路延遲,加快頁面開啟速度,提升使用者體驗。
緩衝類型
1、資料庫緩衝
在大型web應用開發過程中,會對資料庫進行頻繁查詢,容易導致資料庫不堪重負,我們一般會將首次查詢出的資料放入記憶體中進行緩衝,下次查詢時,直接從記憶體中擷取,而不用重新查詢資料庫,從而提升響應效率。常用的資料庫緩衝方案有memcached和redis。二者的區別本次不做討論
2、伺服器端緩衝
Proxy 伺服器緩衝:當Proxy 伺服器轉寄原始伺服器返回的響應時,將儲存一份資源的副本。可以把它理解成一個共用快取,共用快取儲存的響應能夠被多個使用者使用。快取服務器的優勢在於利用緩衝可以避免多次從原始伺服器轉寄資源,用戶端可以就近從快取服務器擷取資源,原始伺服器也就不必多次處理相同的請求了。
cdn緩衝:也叫網關緩衝或者反向 Proxy緩衝。從瀏覽器的角度來看,整個cdn就是一個原始伺服器。
3、用戶端緩衝
也叫瀏覽器緩衝或者是私人緩衝,瀏覽器緩衝根據一套與伺服器約定的規則進行工作,在同一個會話過程中會檢查一次並確定緩衝的副本足夠新。這些規則是在HTTP協議頭和HTML頁面的Meta標籤中定義。需要注意的是meta標籤的http-equiv屬性只有部分瀏覽器可以支援,而且所有緩衝Proxy 伺服器都不支援,因為代理不解析HTML內容本身。瀏覽器會在你的硬碟上專門開闢一個空間專門為你儲存資源副本。這些緩衝為瀏覽過的文檔提供向後/向前置航,儲存網頁,查看源碼等功能,可以避免再次向伺服器發起多餘的請求。它同樣可以提供緩衝內容的離線瀏覽。如果你瀏覽過程中,比如前進或後退,訪問到同一個圖片,這些圖片可以從瀏覽器緩衝中調出而即時顯現。
緩衝策略
1、緩衝儲存策略
通過http回應標頭Cache-Control 頭裡的 public、private、no-cache、max-age 、no-store來決定http響應內容是否可以被用戶端緩衝,前4個都會快取資料到本地,而no-store則不會在用戶端緩衝任何響應資料(需要明白的是no-cache只是不緩衝到期資源,而並不是不緩衝)。資料緩衝到本地後瀏覽器並不是直接使用,而是先要確定緩衝是否到期(見下文)。
2、緩衝到期策略
Cache-Control、Expires指明當前資源的有效期間,控制用戶端是否直接從瀏覽器緩衝取資料還是重新發請求到伺服器取資料。用戶端通過這兩個欄位確認儲存在本地的快取資料是否已到期(比較max-age和age或者Expires和Date),從而決定是否要發送請求到伺服器重新下載一份資源。需要注意的是Cache-Control的優先順序高於Expires,同時存在時前者會覆蓋後者。如果Cache-Control不存在,則會檢查是否包含Expires,如果Expires不存在,那麼緩衝壽命就是Date的值減去Last-Modified的值除以10。緩衝到期只是告訴用戶端先不要從本地讀取緩衝,並不是從此就沒用了,等到發送請求到原始伺服器確認後,如果檔案沒有被修改,那麼還會接著使用(見下文)。
3、緩衝校正策略
客戶端檢測到資料到期或瀏覽器重新整理後,會重新向源伺服器發送一個http請求,伺服器並不急於返迴響應,而是先通過Last-Modified與ETag來判斷資源是否有被更改。
Last-Modified/If-Modified-Since
Last-Modified: 緩衝的弱校正器,標示這個響應資源的最後修改時間。web伺服器在響應請求時,告訴瀏覽器資源的最後修改時間。
If-Modified-Since:當資源到期時,發現資源具有Last-Modified聲明,則再次向web伺服器請求時帶上頭 If-Modified-Since,表示請求時間。web伺服器收到請求後發現有頭If-Modified-Since 則與被請求資源的最後修改時間進行比對。若最後修改時間較新,說明資源又被改動過,則響應整片資源內容(寫在響應訊息包體內),HTTP 200;若最後修改時間較舊,說明資源無新修改,則響應HTTP 304 (無body,節省瀏覽),告知瀏覽器繼續使用所儲存的cache。
Etag/If-None-Match
Etag:緩衝的強校正器,web伺服器響應請求時,告訴瀏覽器當前資源在伺服器的唯一標識。Apache中,ETag的值,預設是對檔案的索引節(INode),大小(Size)和最後修改時間(MTime)進行Hash後得到的。
If-None-Match:當資源到期時(使用Cache-Control標識的max-age),發現資源具有Etage聲明,則再次向web伺服器請求時帶上頭If-None-Match (Etag的值)。web伺服器收到請求後發現有頭If-None-Match 則與被請求資源的相應校正串進行比對,決定返回200或304。
Last-Modified與ETag
Last-Modified已經足以讓瀏覽器知道本地的快取複本是否足夠新,為什麼還需要Etag(實體標識)呢?HTTP1.1中Etag的出現主要是為瞭解決幾個Last-Modified比較難解決的問題
Last-Modified標註的最後修改只能精確到秒級,如果某些檔案在1秒鐘以內,被修改多次的話,它將不能準確標註檔案的修改時間
如果某些檔案會被定期產生,當有時內容並沒有任何變化,但Last-Modified卻改變了,導致檔案沒法使用緩衝
有可能存在伺服器沒有準確擷取檔案修改時間,或者與Proxy 伺服器時間不一致等情形
Etag是伺服器或者由開發人員產生的對應資源在伺服器端的唯一識別碼,能夠更加準確的控制緩衝。Last-Modified與ETag是可以一起使用的,伺服器會優先驗證ETag,一致的情況下,才會繼續比對Last-Modified,最後才決定是否返回304。
總結
重用已擷取的資源能夠有效提升網站與應用的效能。Web 緩衝能夠減少延遲與網路阻塞,進而減少顯示某個資源所用的時間。藉助 HTTP 緩衝,Web 網站變得更具有響應性。
http緩衝機制