一次HTTP請求中的緩存

 

From:http://www.cnblogs.com/PurpleTide/archive/2011/10/10/2205344.htmlcss

 

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

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

1.瀏覽器端存儲:ajax

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

2.瀏覽器端文件緩存數據庫

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

3.HTTP緩存304:apache

  • 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應用上有所收穫

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

相關文章
相關標籤/搜索