一次HTTP請求中的緩存

 

一個HTTP Request從用戶點擊的一瞬間,到服務器返回請求,一般會經過以下類型的緩存

(按照由客戶端到服務器端的順序)

1.瀏覽器端存儲:

  • HTML5中的本地存儲功能允許在瀏覽器端保存數據.
  • Flash等第三方插件也有類似的功能.
  • JavaScript保存一些數據在當前Context也算這種類型.

2.瀏覽器端文件緩存

  • HTTP協議中在時間未過期等情況下,不請求服務器數據而直接使用本地的文件 (請參考HTTP協議中關於緩存控制的部分)
  • 常用於html JavaScript css等文件的緩存,以減少請求次數

3.HTTP緩存304:

  • HTTP協議中,如果服務器文件未發生變化,不返回用戶請求的數據,而只是返回一個304響應 (更多內容請參考HTTP協議)
  • 不減少請求數量,但是減少了響應的體積
  • 通過控制動態文件的輸出內容實現緩存(可以瞭解一下 Etag 等相關內容)

4.服務器端文件類型緩存

  • 動態頁面靜態化爲html文件;
  • 代理服務器, CDN等..
  • 某些不常更新的的數據靜態化爲文件
  • 主要是爲了節省服務器資源,例如CPU

5.普通內存緩存:

  • 這是我們平時用的最多的緩存
  • 功能很強,例如.net中的Cache類按照時間等規則定時過期數據,例如緩存數據庫數據

6.分佈式緩存

  • 例如Memcached,現代應用程序的規模越來越大,難免用上此類方案
  • 經常通過自己分割程序實現分佈式的緩存

7.數據庫緩存

  • 大部分數據庫都會把數據加載到內存中以提高性能

8.表現層&DOM緩存

  • 在客戶端和服務器端緩衝HTML片段,(只更新需要更新的部分,如很多ajax的實現)
  • 例如jQuery中的鏈式表達式 (某些數據說明鏈式表達式會快25%)

以上涉及的部分都是可以通過開發或者配置實現控制的(有些不容易控制的緩存類型就沒有提到)

此外:

  • 許多編程語言中把數據放在靜態變量等成員中,其實也是一種緩存
  • 除了對於數據和文件的緩存以外,還有很多對於程序本身的緩存
  • 關於HTTP Cache部分可以查看 RFC 2616
  • 許多組件自帶緩存功能,例如NHibernate,如果注意其配置可以獲得不錯的性能提升

按照常用程度從多到少,開發難度從容易到複雜,在開發中優先度從高到低

個人建議的順序爲 5 > 2 > 3  > 8  > 4

服務器緩存直接在代碼中開發,成本低,功能強

HTTP緩存一般由服務器(IIS,apache)等內置支持,當然 也可以編程實現,也是很推薦的做法

本地存儲還不夠普及,在對客戶端要求較高的網站中使用較多

MemCached之類的解決方案是對較大規模的網站必用的

數據庫緩存是一個比較難以控制的範疇,(相比來說  優化索引和數據庫設計更爲有效)

同時推薦幾個Tool

Fiddler  HttpWatch  用來跟蹤http請求的細節

DotTrace 用來跟蹤.net代碼的細節

希望以上這些內容可以讓各位在開發高性能web應用上有所收穫

如有遺漏&謬誤,還請各位高手指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章