一個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應用上有所收穫
如有遺漏&謬誤,還請各位高手指正