在.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并不是从物理内存中删除缓存的数据,仅仅在取出更改数据缓存时检查它是否已过期。

⊃2; DOS以命令行启动Memcached: memcached.exe -p 11211 -m 512 (端口11211,内存512M)。

⊃2; DOS命令行查看memcached状态:telnet localhost 11211 (输入命令stats)

Memcached命令大全:

   1:  
<!--CRLF-->
   2: -p 监听的端口
<!--CRLF-->
   3: -l 连接的IP地址, 默认是本机
<!--CRLF-->
   4: -d start 启动memcached服务
<!--CRLF-->
   5: -d restart 重起memcached服务
<!--CRLF-->
   6: -d stop|shutdown 关闭正在运行的memcached服务
<!--CRLF-->
   7: -d install 安装memcached服务
<!--CRLF-->
   8: -d uninstall 卸载memcached服务
<!--CRLF-->
   9: -u 以的身份运行 (仅在以root运行的时候有效)
<!--CRLF-->
  10: -m 最大内存使用,单位MB。默认64MB
<!--CRLF-->
  11: -M 内存耗尽时返回错误,而不是删除项
<!--CRLF-->
  12: -c 最大同时连接数,默认是1024
<!--CRLF-->
  13: -f 块大小增长因子,默认是1.25
<!--CRLF-->
  14: -n 最小分配空间,key+value+flags默认是48
<!--CRLF-->
  15: -h 显示帮助
<!--CRLF-->

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

需要分布式缓存的对象需要序列化,在.Net中对实体加上 [Serializable]标记。

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

1.5.4. 从缓存中获取数据

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

使用Memcached分布式缓存可以大大提高应用程序的性能, 根据经验Memcached可以将单台服务器的并发访问效率提升了几十~数百倍(我在本机测试性能提升500倍)。

1.6. 缓存策略

当然,在实际应用系统中需要考虑缓存策略,缓存什么时候过期,如何对实体进行缓存,如何保证与数据库的同步。(待续 …)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值