zoukankan      html  css  js  c++  java
  • 在.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,安装之。

    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. 缓存策略

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

    
    
    

     

  • 相关阅读:
    HDU 2899 Strange fuction
    HDU 2899 Strange fuction
    HDU 2199 Can you solve this equation?
    HDU 2199 Can you solve this equation?
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
  • 原文地址:https://www.cnblogs.com/jinqi79731/p/3119105.html
Copyright © 2011-2022 走看看