Memcached是一個高效能的分布式記憶體對象緩衝系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料和對象來減少讀取資料庫的次數, 從而提供動態、資料庫驅動網站的速度。Memcached作為緩衝技術的解決方案,已經是眾所周知了;現在很多WEB應用都在使用它——包括一些知名的網 站。若你還不知道這些,請在閱讀之前先瞭解一下。
在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);等等。可以自己琢磨了。
以上只是示範,其實資料緩衝是一項複雜而繁瑣的工作,不僅需要後台代碼的分層最佳化,也需要資料庫對大資料量訪問的策略和調優。
asp.net 本身就有cache功能,很強大(我比較推薦Runtime cached),可以指定cache的時間,或活躍時間 callback等等,,為什麼要用memcached呢?
我以一直以為memcached這樣的功能是給php這樣不具備cached功能的用的