現在一些。NET開發人員開始放棄ASP.NET內建的緩衝機制,轉而使用Memcached——一種分布式的記憶體緩衝系統,其最初是由Danga Interactive公司為LiveJournal網站而開發。
緩衝的一個基礎性問題就是如何處理過時資料。當運行在單獨的Web伺服器上,你可以很容易地清除一個已經確認被改變了的緩衝。可惜,ASP.NET沒有一個很好的方法來支援多伺服器。每個伺服器上的緩衝都對其他緩衝的改變一無所知。
ASP.NET允許通過基於檔案系統和資料庫表的觸發器來作廢一個緩衝。然而,這也存在問題,比如資料庫觸發器需要使用昂貴的輪詢,以及觸發器本身冗長的編程。但是,我們還是有其他的選擇的。
不像ASP.NET內建的緩衝機制,Memcached是一個分布式的緩衝系統。任何Web伺服器都能更新或刪除一個快取項目,並且所有其他的伺服器都能在下次訪問這些快取項目的時候自動擷取到更新的內容。這是通過把這些快取項目儲存在一個或者多個快取服務器上來實現的。每一個快取項目都根據它的關鍵字的雜湊值來分配到一個伺服器上。內容來自中國站長資訊網(www.chinahtml.com)
表面看來,Memcached針對ASP.NET的API就像和內建的API一樣。這讓開發人員很容易地轉換到Memcached上,僅僅通過在代碼中尋找和替換即可實現。
然而僅僅只是讓其運行起來還不夠,如果要在大型Web Farms(譯者註:大型網站)正確地使用還需要注意一些問題。Richard Jones寫到:內容來自中國站長資訊網(www.chinahtml.com)
當我們添加很多節點後,get_multi函數的有用性在降低——這可能是由於單獨的頁面,需要訪問幾乎所有的Memcached執行個體。我在某處讀到 Facebook(譯者註:現在很火的校園社交網站)把他們的Memcached叢集進行分割以提高get_multi的效能(例如,所有使用者的資料都放置在名為mc的子集節點上)。有人能告訴我這樣做的效果嗎?
一個被推薦的解決方案是不根據快取項目的關鍵字來產生雜湊索引值。這將允許開發人員能夠讓一個給定頁面中需要的所有快取項目,盡量存放在同一個伺服器上。可惜,基於資料儲存的地方而不是基於快取項目自身的關鍵字來產生雜湊鍵,很容易產生錯誤,需要仔細來實現(這個演算法)。
ASP.NET中Memcached
一,準備
你需要有一下軟體:
VS.NET(05/08)
SQLSERVER
memcached伺服器端以及用戶端類庫(開源軟體,下載即可)
其中,用戶端類庫包括以下幾個DLL:
Memcached.ClientLibrary.dll
ICSharpCode.SharpZipLib.dll
log4net.dll
二,安裝memcached伺服器端
將memcached.exe複製到任意目錄下,如 c:,在命令列輸入:
memcached.exe -d install
memcached將作為一個服務常駐系統記憶體了
三,建立ASP.NET工程
建立一個ASP.NETWEB項目,命名為MMCWEB,添加以上提到的幾個用戶端類庫的引用。
四,配置
memcached使用了log4net,所以我們先配置log4net
在web.config裡找到configSections節點,添加以下內容
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
再在configSections節點之外,增加以下內容:
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="LogFiles/"/>
<param name="AppendToFile" value="true"/>
<param name="MaxSizeRollBackups" value="10"/>
<param name="StaticLogFileName" value="false"/>
<param name="DatePattern" value="yyyy-MM-dd".txt""/>
<param name="RollingStyle" value="Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger %ndc - %message%newline"/>
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
<logger name="Memcached.ClientLibrary">
<level value="WARN" />
</logger>
</log4net>
啟動調試,若沒出現配置的出錯提示,並且在網站目錄下有檔案夾LogFiles,就說明log4net配置成功了。
五,初始化SockIOPool
SockIOPool是什麼東東?SockIOPool是Memcached用戶端提供的一個通訊端串連池,通俗講,就是與Memcached伺服器端交換資料的對象。SockIOPool在應用程式啟動時初始化一次就可以了,我把這個工作放在 GLOBAL.ASAX.CS的Application_Start方法裡
char[] separator = { ',' };
string[] serverlist = ConfigurationManager.AppSettings["Memcached.ServerList"].Split(separator);
// initialize the pool for memcache servers
try
{
SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(serverlist);
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 50;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30;
pool.Failover = true;
pool.Nagle = false;
pool.Initialize();
}
catch (Exception err)
{
//這裡就可以用Log4Net記錄Error啦!
}
注意AppSettings["Memcached.ServerList"]是在WEB.CONFIG裡設定的,所以WEB.CONFIG的appSettings的子節點裡需要有以下一行
<add key="Memcached.ServerList" value="127.0.0.1:11211"/>
啟動調試伺服器,若沒有出錯的日誌記錄,說明IO串連池已經開闢成功。
六,使用Memcached
終於進入正題了,不過使用之前,我們還需要準備一些資料。
建立一個實體類People,並加上Serializable屬性!!!
對應的資料庫裡,增加一張表,欄位對應實體類,插入一些測試資料。持久層和業務層的設計就略過了,他們負責向提供一些資料,傳回型別可自定,若ILIST,DATASET。
Memcached使用起來就很簡單了,比如後台檢索出一組People類型的資料,放在一個叫peopleList的arraylist裡,而且這個arraylist要頻繁使用,只需要這樣
MemcachedClient mc = new MemcachedClient();
mc.EnableCompression = true;
mc.Set(key, peopleList);
上面的key是用來訪問這個arraylist的鍵,Memcached裡的資料都是儲存為鍵-值對的。
一旦mc.KeyExists(key)為TRUE,就用return mc.Get(key) as ArrayList提取資料,刪除時,使用 return mc.Delete(key);等等。可以自己琢磨了。
以上只是示範,其實資料緩衝是一項複雜而繁瑣的工作,不僅需要後台代碼的分層最佳化,也需要資料庫對大資料量訪問的策略和調優。
http://www.chinahtml.com/0707/asp-118489071915107.html
.NET下實現分布式緩衝系統Memcached :http://tech.it168.com/a2009/0907/675/000000675239.shtml
使用Memcached提高.NET應用程式的效能(周公) :http://zhoufoxcn.blog.51cto.com/792419/528212