?????Memcached?是一個高性能的分布式內(nèi)存對象緩存系統(tǒng),用于動態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫負(fù)載。它通過在內(nèi)存中緩存數(shù)據(jù)和對象來減少讀取數(shù)據(jù)庫的次數(shù),從而提供動態(tài)、數(shù)據(jù)庫驅(qū)動網(wǎng)站的速度。Memcached作為緩存技術(shù)的解決方案,已經(jīng)是眾所周知了;現(xiàn)在很多WEB應(yīng)用都在使用它――包括一些知名的網(wǎng)站。若你還不知道這些,請在閱讀之前先了解一下。 ??????? 在ASP.NET中使用Memcached,有很多文章都有介紹,以下是我個人的使用經(jīng)驗。 ??????? 一,準(zhǔn)備 ??????? 你需要有一下軟件: ?????? VS.NET(05/08) ?????? SQLSERVER ?????? memcached服務(wù)器端以及客戶端類庫(開源軟件,下載即可) 其中,客戶端類庫包括以下幾個DLL: ?????? Memcached.ClientLibrary.dll ?????? ICSharpCode.SharpZipLib.dll ?????? log4net.dll ?????? 二,安裝memcached服務(wù)器端 ?????? 將memcached.exe復(fù)制到任意目錄下,如 c:,在命令行輸入: memcached.exe -d install memcached將作為一個服務(wù)常駐系統(tǒng)內(nèi)存了 ????? 三,建立ASP.NET工程 ???? 創(chuàng)建一個ASP.NETWEB項目,命名為MMCWEB,添加以上提到的幾個客戶端類庫的引用。 ???? 四,配置 ???? memcached使用了log4net,所以我們先配置log4net 在web.config里找到configSections節(jié)點(diǎn),添加以下內(nèi)容 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 再在configSections節(jié)點(diǎn)之外,增加以下內(nèi)容: <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> 啟動調(diào)試,若沒出現(xiàn)配置的出錯提示,并且在網(wǎng)站目錄下有文件夾LogFiles,就說明log4net配置成功了。 五,初始化SockIOPool SockIOPool是什么東東?SockIOPool是Memcached客戶端提供的一個套接字連接池,通俗講,就是與Memcached服務(wù)器端交換數(shù)據(jù)的對象。SockIOPool在應(yīng)用程序啟動時初始化一次就可以了,我把這個工作放在 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里設(shè)置的,所以WEB.CONFIG的appSettings的子節(jié)點(diǎn)里需要有以下一行 <add key="Memcached.ServerList" value="127.0.0.1:11211"/> 啟動調(diào)試服務(wù)器,若沒有出錯的日志記錄,說明IO連接池已經(jīng)開辟成功。 ??????? 六,使用Memcached ?????? 終于進(jìn)入正題了,不過使用之前,我們還需要準(zhǔn)備一些數(shù)據(jù)。 ????? 創(chuàng)建一個實體類People,并加上Serializable屬性!!! ????? 對應(yīng)的數(shù)據(jù)庫里,增加一張表,字段對應(yīng)實體類,插入一些測試數(shù)據(jù)。持久層和業(yè)務(wù)層的設(shè)計就略過了,他們負(fù)責(zé)向提供一些數(shù)據(jù),返回類型可自定,若ILIST,DATASET。 ???? Memcached使用起來就很簡單了,比如后臺檢索出一組People類型的數(shù)據(jù),放在一個叫peopleList的arraylist里,而且這個arraylist要頻繁使用,只需要這樣 MemcachedClient mc = new MemcachedClient(); mc.EnableCompression = true; mc.Set(key, peopleList);????? ???????? 上面的key是用來訪問這個arraylist的鍵,Memcached里的數(shù)據(jù)都是保存為鍵-值對的。 一旦mc.KeyExists(key)為TRUE,就用return mc.Get(key) as ArrayList提取數(shù)據(jù),刪除時,使用 return mc.Delete(key);等等??梢宰约鹤聊チ?。 ???????? 以上只是演示,其實數(shù)據(jù)緩存是一項復(fù)雜而繁瑣的工作,不僅需要后臺代碼的分層優(yōu)化,也需要數(shù)據(jù)庫對大數(shù)據(jù)量訪問的策略和調(diào)優(yōu)。 文章來自學(xué)IT網(wǎng):http://www.xueit.com/html/2009-05/21_2027_00.html (責(zé)任編輯:admin) |