`
nnwq
  • 浏览: 203287 次
社区版块
存档分类
最新评论

在.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
4
分享到:
评论

相关推荐

    基于.NET Cache+Memcached Web缓存技术的研究与应用

    一份.NET中实现MEMCACHED的总结。

    分布式缓存系统Memcached在Asp.net下的应用

    修改Common/DB_Info.cs下查询语句, 改成你数据库中任意的表就行 cmd.CommandText = "select top 100 * from UM_Function order by FuncID"; 3.检查是否为缓存方法: 运行程序后,第一次加载数据,会将数据存入...

    memcached 在ASP.NET网站下的应用实例代码(c#)

    memcached 在ASP.NET下的应用实例代码,适合初学者和想memcached 提高的朋友

    .net memcached 分布式缓存应用类库

    .net下memcached 分布式缓存系统应用

    Memcached1.4.4-14

    Memcached服务 在.Net下如何应用memcached的示例

    C#/.net分布式缓存系统Memcached 实例

    也就是可以允许不同主机上的多个用户同时访问这个缓存系统,这种方法不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度,Memcached用于在动态应用中减少...

    Java环境下Memcached应用详解.docx

    本文档主要讲述的是Java环境下Memcached应用详解;...Memcached主要是集群环境下的缓存解决方案,可以运行在Java或者.NET平台上,这里我们主要讲的是Windows下的Memcached应用。希望本文档会给有需要的朋友带来帮助;

    Memcached缓存资料

    由于memcached通常只是当作快取系统使用,所以使用memcached的应用程式在写回较慢的系统时(像是后端的数据库)需要额外的程式码更新memcached内的资料[1] memcached 是以LiveJournal 旗下Danga Interactive 公司的...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    ASP.Net中有一些技术是有局限性的,传智播客根据这些技术在企业中的实际应用情况进行了调整、补充。比如项目中几乎没有在UI层直接访问数据库的,而是采用三层架构,因此我们不讲解UI层直连数据库的控件SQLDataSource...

    亮剑.NET深入体验与实战精要2

    8.2.2 创建ASP.NET Ajax应用程序 333 8.2.3 ScriptManager控件使用技巧 335 8.2.4 UpdaetPanel控件使用技巧 336 8.2.5 AsyncPostBackTrigger实现 外部控件引发局部刷新 338 8.2.6 Ajax错误处理 341 8.2.7 告诉用户...

    分布式缓存系统Memcached

     Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。Memcached通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及...

    完整的.net Memcache实例项目

    另外,memcached通常部署在业务逻辑层(前台应用)和存储层(主指数据库)之间,作为数据库和前台应用的数据缓冲,因此可以快速的响应前端的请求,减少对数据库的访问。 官方网站:http://www.danga.com/memcached/

    20120102 net下memcached 分布式缓存系统应用

    20120102 net下memcached 分布式缓存系统应用 本人收藏了3年的资源 现放出 都是总结了很多系统 软件项目实施过程中的经验的 慢慢积累的

    _net memcached 分布式缓存应用类库

    _net memcached 分布式缓存应用类库 京华志&精华志出品 分享资源 C# ASP.NET SQL DBA 源码

    亮剑.NET深入体验与实战精要3

    8.2.2 创建ASP.NET Ajax应用程序 333 8.2.3 ScriptManager控件使用技巧 335 8.2.4 UpdaetPanel控件使用技巧 336 8.2.5 AsyncPostBackTrigger实现 外部控件引发局部刷新 338 8.2.6 Ajax错误处理 341 8.2.7 告诉用户...

    dot net memcached 分布式缓存应用类库

    dot net memcached 分布式缓存应用类库 本人收藏了3年的资源 现放出 都是总结了很多系统 软件项目实施过程中的经验的 慢慢积累的

    Netcached:.Net 内存分布式键值存储 ala memcached

    安装服务器 - 将应用程序添加到 IIS 站点并将应用程序的物理路径设置为 Netcached.Server 文件夹。 服务器还需要 https 绑定 要使用客户端 - 在 Visual Studio 中构建 Netcached 项目后,只需在项目中添加引用 ...

    Memcached 入门介绍(安装与配置)

    Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。 它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。 Memcached基于一个存储键值对的...

    决战Nginx 技术卷:高性能Web服务器部署与运维.part3

    《决战Nginx技术卷:高性能Web服务器部署与运维(基于php、Java、...对于ASP.NET的用户来说,现在从Windows系统下向Linux系统迁移的用户很多,这就无疑会使用Mono,在本书中同样能够找到Mono的使用和迁移的解决方案。

    决战Nginx 技术卷:高性能Web服务器部署与运维.part2.rar

    《决战Nginx技术卷:高性能Web服务器部署与运维(基于php、Java、...对于ASP.NET的用户来说,现在从Windows系统下向Linux系统迁移的用户很多,这就无疑会使用Mono,在本书中同样能够找到Mono的使用和迁移的解决方案。

Global site tag (gtag.js) - Google Analytics