Web緩存雜談

1、概述

緩存通俗點,就是將已經獲得的‘東東’存放在一個相對於本身而言,儘量近的地方,以便下次須要時,不會再二筆地跑到起始點(很遠的地方)去獲取,而是就近解決,從而縮短期和節約金錢(坐車要錢嘛)。Web緩存,也是一樣的道理,說白了,就是當你第一次訪問網址時,將這個東東(representations),如html頁面、圖片、JavaScript文件等,存在一個離你較近的地方,當你下次還須要它時,不用再一次跋山涉水到服務器(origin servers)去獲取。繼而,web緩存的優點也就很明顯了:html

  一、  減小了網絡延遲,加快了頁面響應速度,加強了用戶體驗嘛。(由於我是就近獲取的,路程縮短了,因此響應速度固然比到遙遠的服務器去獲取快哦);web

  二、  減小了網絡帶寬消耗嘛。(就近獲取);數據庫

  三、  經過緩存,咱們都不用到服務器 (origin servers)去請求了,從而也就相應地減輕了服務器的壓力。後端

那web緩存將這些東東放在哪兒呢?下面我就看看有哪些緩存種類,從而瞭解放在哪吧。瀏覽器

2、Web緩存的種類

--數據庫緩存--:緩存

當web應用關係複雜,數據表蹭蹭蹭往上漲時,能夠將查詢後的數據放到內存中進行緩存,下次再查詢時,就直接從內存緩存中獲取,從而提升響應速度。服務器

--CDN緩存--:網絡

CDN通俗點,就是當咱們發送一個web請求時,會先通過它一道手,而後它幫咱們計算路徑,去哪獲得這些東東(representations)的路徑短且快。這個是網站管理員部署的,因此他們也能夠將你們常常訪問的representations放在CDN裏,這樣,就響應就更快了。網站

--代理服務器緩存--:ui

代理服務器緩存,其實跟下面即將講的瀏覽器緩存性質差很少,差異就是代理服務器緩存面向的羣體更廣,規模更大而已。即,它不僅爲一個用戶服務,通常爲大量用戶提供服務,同一個副本會被重用屢次,所以在減小相應時間和帶寬使用方面頗有效。

--瀏覽器緩存--:

簡而言之,就是,每一個瀏覽器都實現了 HTTP 緩存,咱們經過瀏覽器使用HTTP協議與服務器交互的時候,瀏覽器就會根據一套與服務器約定的規則進行緩存工做。當咱們點擊瀏覽器上‘後退’或者‘前進’按鈕時,顯得特別有用。

3、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緩存機制--

一、  Expires

http緩存機制主要在http響應頭中設定,響應頭中相關字段爲Expires、Cache-Control、Last-Modified、If-Modified-Since、Etag。

HTTP 1.0協議中的。簡而言之,就是告訴瀏覽器在約定的這個時間前,能夠直接從緩存中獲取資源(representations),而無需跑到服務器去獲取。

另:Expires由於是對時間設定的,且時間是Greenwich Mean Time (GMT),而不是本地時間,因此對時間要求較高。

二、  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:禁止一切緩存(這個纔是響應不被緩存的意思)。

三、  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。

四、  Last-Modified & If-Modified-Since

Last-Modified與Etag相似。不過Last-Modified表示響應資源在服務器最後修改時間而已。與Etag相比,不足爲:

  (1)、Last-Modified標註的最後修改只能精確到秒級,若是某些文件在1秒鐘之內,被修改屢次的話,它將不能準確標註文件的修改時間;

  (2)、若是某些文件會被按期生成,當有時內容並無任何變化,但Last-Modified卻改變了,致使文件無法使用緩存;

  (3)、有可能存在服務器沒有準確獲取文件修改時間,或者與代理服務器時間不一致等情形。

然而,Etag是服務器自動生成或者由開發者生成的對應資源在服務器端的惟一標識符,可以更加準確的控制緩存。

4、擴展閱讀

[1]、"Caching Tutorial" 

相關文章
相關標籤/搜索