在.Net下應用memCached


1. Memcached

1.1. Memcached簡介

應用系統都將數據保存在關系數據庫中,應用服務器從中讀取數據並在瀏覽器中顯示。 但隨着數據量的增大、用戶訪問的集中,就會出現DB的負擔加重、應用系統延遲等重大影響。 制約高並發訪問的因素往往是讀寫性能較慢的IO,為了提高應用程序的訪問性能,將一些常用的數據緩存在內存中可以大幅度提高訪問效率。

在.NET中提供了一個Cache類可以實現這些功能, 如ASP.NET中的HttpContext 對象,微軟也封裝了Cache Enterprise Library來解決基本的緩存問題。 在大部分情況下我們都可以使用Cache類來提高.NET的性能,但是使用Cache類也有一些不足,比如我們不能指定Cache類所占用的內存的大小。其次,針對大型Web站點我們需要緩存大量數據,因此需要將Cache中緩存的數據移到另一台機器,甚至多台專用緩存服務器上,即使用分布式緩存方案。 分布式緩存的特點是緩存的數據不必和應用程序在同一台機器上,從而大大增強了緩存數據的復用性。

memcached是一個免費開源、高性能、分布式內存緩存系統,用於大型Web站點的性能優化提升,減少DB及文件系統的訪問壓力。 memcached是高性能的分布式內存緩存服務器。 一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。

 

1.2. Key-Value

Memcached是一個基於Key-value鍵值存儲模型。 由於使用了高效Key的hash算法來設計存儲數據結構,並且設計了精心的內存分配器,所以查詢性能非常高,時間復雜度達到O(1),即無論你存儲多少數據項,查詢任何數據定位的時間都一樣高效,不會有任何變化。

1.3. 安裝Memcached服務

目前有多種平台的Memcached版本,比如Linux、FreeBSD、Solaris 、Mac OS X及Windows平台。

可在官網下載到最新版本: http://memcached.org/ (LINUX) 。 這里,我們安裝Windows版本來演示。Windows版本安裝步驟為:

1) 下載memcache for windows。下載地址:http://download.csdn.net/detail/tinysoft/5521891  ,解壓到d:\memcached。

2) 在命令行狀態下輸入: d:\memcached\memcached.exe -d install 。至此memcached已經安裝成windows服務

3) 在命令行下輸入: d:\memcached\memcached.exe -d start 以啟動memcached服務。當然也可以選擇在windows服務中啟動。

1.4. memcached的基本設置

安裝后可以指定Memcached監聽的端口和最大內存大小。如果緩存的數據大小超過指定內存,那么Memcached就會按照LRU算法將最近不常訪問的數據項淘汰掉。新增的緩存數據就可以使用這些標記為失效的數據所占用的內存,就不會導致memcached內存不夠的問題。此外,為了提高性能,在緩存數據過期后Memcached並不是從物理內存中刪除緩存的數據,僅僅在取出更改數據緩存時檢查它是否已過期。

² DOS以命令行啟動Memcached: memcached.exe -p 11211 -m 512 (端口11211,內存512M)。

² DOS命令行查看memcached狀態:telnet localhost 11211 (輸入命令stats)

Memcached命令大全:

 1:  
 2: -p 監聽的端口
 3: -l 連接的IP地址, 默認是本機
 4: -d start 啟動memcached服務
 5: -d restart 重起memcached服務
 6: -d stop|shutdown 關閉正在運行的memcached服務
 7: -d install 安裝memcached服務
 8: -d uninstall 卸載memcached服務
 9: -u 以的身份運行 (僅在以root運行的時候有效)
 10: -m 最大內存使用,單位MB。默認64MB
 11: -M 內存耗盡時返回錯誤,而不是刪除項
 12: -c 最大同時連接數,默認是1024
 13: -f 塊大小增長因子,默認是1.25
 14: -n 最小分配空間,key+value+flags默認是48
 15: -h 顯示幫助

1.5. 在.NET中應用Memcached

1.5.1. Memcached .NET客戶端

有很多.NET版本的Memcached客戶端程序,Memcached .NET客戶端:

1) enyim.com Memcached Client

  下載地址:http://nuget.org/packages/EnyimMemcached/ 

2) NET memcached client library

  下載地址:https://sourceforge.net/projects/memcacheddotnet

3) Memcached Providers

  下載地址:http://www.codeplex.com/memcachedproviders

4) BeIT Memcached

  下載地址:http://code.google.com/p/beitmemcached/

1.5.2. Enyim.Cachine DLL

我們也可以用NuGet包直接安裝,在包管理器中搜索:enyim,安裝之。

2

1.5.3. Enyim.Cachine Memcached配置

在項目中使用Memcached,添加Enyim.Caching.dll引用。更改config配置Memcached:

 1: <configSections>
 2:  
 3: <sectionGroup name="enyim.com">
 4:  
 5: <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
 6:  
 7: </sectionGroup>
 8:  
 9: <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
 10:  
 11: </configSections>
 12:  
 13: <enyim.com>
 14:  
 15: <memcached>
 16:  
 17: <servers>
 18:  
 19: <!-- put your own server(s) here-->
 20:  
 21: <add address="huhm" port="11211" />
 22:  
 23: <!--<add address="huhm2" port="20004" />-->
 24:  
 25: </servers>
 26:  
 27: <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
 28:  
 29: </memcached>
 30:  
 31: </enyim.com>
 32:  
 33: <memcached keyTransformer="Enyim.Caching.TigerHashTransformer, Enyim.Caching">
 34:  
 35: <servers>
 36:  
 37: <add address="huhm" port="11211" />
 38:  
 39: <!--<add address="huhm2" port="20004" />-->
 40:  
 41: </servers>
 42:  
 43: <socketPool minPoolSize="2" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
 44:  
 45: </memcached>
 46:  

需要分布式緩存的對象需要序列化,在.Net中對實體加上 [Serializable]標記。

 1: [Serializable]
 2:  
 3: public class Article
 4:  
 5: {
 6:  
 7: public long Article_ID { get; set; }
 8:  
 9: public string Title { get; set; }
 10:  
 11: public DateTime Date_Created { get; set; }
 12:  
 13: public bool Draft { get; set; }
 14:  
 15: public string Content { get; set; }
 16:  
 17: }

1.5.4. 從緩存中獲取數據

 1: //by tinyhu,2013
 2:  
 3: public List<Article> GetAllFromMemcached()
 4:  
 5: {
 6:  
 7: List<Article> lstArticle = memCachedClient.Get<List<Article>>("LstArticle");
 8:  
 9: if (lstArticle == null)
 10:  
 11: {
 12:  
 13: lstArticle = this.ArticleDao.GetAll().ToList();
 14:  
 15: memCachedClient.Store(Enyim.Caching.Memcached.StoreMode.Add, "LstArticle", lstArticle);
 16:  
 17: }
 18:  
 19: return lstArticle;
 20:  
 21: }
 22:  
 23: //by tinyhu,2013
 24:  
 25: public string GetMyBlog(long questionId) 
 26:  
 27: { 
 28:  
 29: string cacheKey = GetCacheKey(questionId); 
 30:  
 31: string body = cacheService.Get<string>(cacheKey); 
 32:  
 33: if (body == null) 
 34:  
 35: { 
 36:  
 37: DiscussQuestion question = Database.SingleOrDefault<DiscussQuestion>(questionId); 
 38:  
 39: body = question.Body ?? string.Empty; 
 40:  
 41: cacheService.Add(cacheKey, body, CachingExpirationType.SingleObject); 
 42:  
 43: } 
 44:  
 45: return body; 
 46:  
 47: }
 48:  

使用Memcached分布式緩存可以大大提高應用程序的性能, 根據經驗Memcached可以將單台服務器的並發訪問效率提升了幾十~數百倍(我在本機測試性能提升500倍)。

1.6. 緩存策略

當然,在實際應用系統中需要考慮緩存策略,緩存什么時候過期,如何對實體進行緩存,如何保證與數據庫的同步。(待續 …)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM