對於網站提高性能,緩存是必不可少的環節。該篇隨筆介紹了緩存以及緩存機制,重點是HTTP緩存機制. ...
一、概述 |
緩存通俗點,就是將已經得到的‘東東’存放在一個相對於自己而言,儘可能近的地方,以便下次需要時,不會再二筆地跑到起始點(很遠的地方)去獲取,而是就近解決,從而縮短時間和節約金錢(坐車要錢嘛)。Web緩存,也是同樣的道理,說白了,就是當你第一次訪問網址時,將這個東東(representations),如html頁面、圖片、JavaScript文件等,存在一個離你較近的地方,當你下次還需要它時,不用再一次跋山涉水到伺服器(origin servers)去獲取。繼而,web緩存的優勢也就很明顯了:
1、 減少了網路延遲,加快了頁面響應速度,增強了用戶體驗嘛。(因為我是就近獲取的,路程縮短了,所以響應速度當然比到遙遠的伺服器去獲取快哦);
2、 減少了網路帶寬消耗嘛。(就近獲取);
3、 通過緩存,我們都不用到伺服器 (origin servers)去請求了,從而也就相應地減輕了伺服器的壓力。
那web緩存將這些東東放在哪兒呢?下麵我就看看有哪些緩存種類,從而瞭解放在哪吧。
二、Web緩存的種類 |
--資料庫緩存--:
當web應用關係複雜,數據表蹭蹭蹭往上漲時,可以將查詢後的數據放到記憶體中進行緩存,下次再查詢時,就直接從記憶體緩存中獲取,從而提高響應速度。
--CDN緩存--:
CDN通俗點,就是當我們發送一個web請求時,會先經過它一道手,然後它幫我們計算路徑,去哪得到這些東東(representations)的路徑短且快。這個是網站管理員部署的,所以他們也可以將大家經常訪問的representations放在CDN里,這樣,就響應就更快了。
--代理伺服器緩存--:
代理伺服器緩存,其實跟下麵即將講的瀏覽器緩存性質差不多,差別就是代理伺服器緩存面向的群體更廣,規模更大而已。即,它不只為一個用戶服務,一般為大量用戶提供服務,同一個副本會被重用多次,因此在減少相應時間和帶寬使用方面很有效。
--瀏覽器緩存--:
簡而言之,就是,每個瀏覽器都實現了 HTTP 緩存,我們通過瀏覽器使用HTTP協議與伺服器交互的時候,瀏覽器就會根據一套與伺服器約定的規則進行緩存工作。當我們點擊瀏覽器上‘後退’或者‘前進’按鈕時,顯得特別有用。
三、Web緩存的執行機制 |
所謂機制就是一些雙方的約定,清晰地告訴對方,什麼時候該做什麼事。web緩存也一樣,你總得告訴我(請求)什麼時候到緩存中去獲取,什麼到伺服器去獲取representations吧。So,也得有一套相應的機制,web 緩存機制分為兩大部分http協議(HTTP1.0和HTTP1.1)和網站管理人員制定的協議。拋開網站內部制定的協議,我們來看看http協議中定義的緩存機制。
By the way,我們可以在HTML文檔中的<head>中通過<meta>來緩存,如下:
<meta http-equiv="Pragma" content="no-cache"/>
但,它只有部分瀏覽器可以用,並且代理伺服器也不會鳥它。(因為meta在html中,代理伺服器幾乎不回去讀它滴)。
--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是一樣的,不過它只針對代理伺服器緩存而言;
(3)、public:指示響應可被任何緩存區緩存;
(4)、private:只能針對個人用戶,而不能被代理伺服器緩存;
(5)、no-cache:強制客戶端直接向伺服器發送請求,也就是說每次請求都必須向伺服器發送。伺服器接收到請求,然後判斷資源是否變更,是則返回新內容,否則返回304,未變更。這個很容易讓人產生誤解,使人誤以為是響應不被緩存。實際上Cache-Control: no-cache是會被緩存的,只不過每次在向客戶端(瀏覽器)提供響應數據時,緩存都要向伺服器評估緩存響應的有效性。
(6)、no-store:禁止一切緩存(這個才是響應不被緩存的意思)。
3、 Etag & If-None-Match
Etag是屬於HTTP 1.1屬性,它是由伺服器生成返回給後端,當你第一次發起HTTP請求時,伺服器會返回一個Etag,併在你再一次發起同一個請求時,客服端會同時發送一個If-None-Match,而它的內容就是Etag的值。最後,伺服器會比對這個客服端發送過來的Etag是否與伺服器的相同,如果相同,就If-None-Match的值為false,返回304繼續使用本地緩存,否則就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)、有可能存在伺服器沒有準確獲取文件修改時間,或者與代理伺服器時間不一致等情形。
然而,Etag是伺服器自動生成或者由開發者生成的對應資源在伺服器端的唯一標識符,能夠更加準確的控制緩存。
四、擴展閱讀 |