在Windows .NET平台下使用Memcached

时间:2021-07-08 03:19:23

网上关于Memcached的文章很多,但据我观察,大多是互相转载或者抄袭的,千篇一律。有些则是直接整理的一些超链接然后贴出来。那些超链接笔者大概都进去看了,其实关于Memcached的中文的技术文章,也就那么几篇,优秀的也就更少了。也许是笔者理解、学习能力太差了吧。最近在.NET项目中可能要使用到Memcached这款出色的分布式缓存系统,所以笔者就笨鸟先飞,先研究了一下下。下面我会将总结一下自己研究的结果,并用实例向大家讲解。(入门级别的,高手请直接跳过)。

关于:Memcached的简介,Memcached的实现原理,Memcached的优势.......等等不是本文的重点。所以直接跳过。

(我已经将本文中必要的源码和类库等上传到了csdn下载频道。避免很多英语不好的朋友,访问国外站点下载时候遇到一些困难,浪费时间)。

由于最近的项目是使用.NET作为开发平台,而且使用的是Windows server 2008作服务器。所以,首先要找到Windows平台下的Memcached版本。

下面,我将下载地址贴出来。

http://download.csdn.net/detail/dinglang_2009/3733784      或者            点击此处直接下载

下载好了Memcached之后,解压到任意目录下,例如:

1. 解压缩文件到c:/memcached      进入cmd控制台(该不会有人问我这个cmd要怎么进去吧?)
    2. 命令行输入 'c:/memcached/memcached.exe -d install'       --安装 Memcached
    3. 命令行输入 'c:/memcached/memcached.exe -d start' ,该命令启动 Memcached ,默认监听端口为 11211。

其实可以通过        memcached.exe -p 11211 -m 64    指定它的监听端口是11211(这是它的默认端口,可以指定为其它大于1024的端口,因为小于1024的端口已经有了默认指定),最大使用内存为64m,如果启用了Windows防火墙,切记要在防火墙上打开这个端口。

注:通过 memcached.exe -h 可以查看其帮助     这里不多做介绍了

启动成功之后,在客户端还可以通过telnet来查看和操作Memcached,前提是服务器端和客户端都支持Telnet协议,在Windows7和Windows2008中基于安全性的考虑,默认都不支持,需要在控制面板中安装和启用。(具体的操作我就不说了)

telnet localhost 11211
连接之后会出现一个命令行窗口,在这个命令行窗口中输入"stats"就可以看到当前Memcached的状态,如下图所示:

在Windows .NET平台下使用Memcached

启动并配置好Memcached的服务端之后呢?我们下面该准备基于.NET平台的客户端了:

据我总结,大概常见的有三四种吧。必要的类库或者源码,我都将提供给大家下载。

1).NET memcached client library

Memcached .NET客户端的类库,目前大概只支持.NET1.0和.NET2.0,笔者没仔细研究这个,估计这个已经过时啦。

2)enyim.com Memcached Client

源码地址:点击下载源码        (开源项目,可提供研究学习)

Enyim也是应用比较广泛的Memcached .net客户端,和之前的Memchachedonet 客户端相比,分布式算法应该做了相应优化

3)Memcached Providers

下载地址:点击下载

Memcached Providers的官网上有一份PDF的文档,是教你怎么配置的。英语不好的童鞋,可以直接参考我的配置(稍后会讲解)。

4) BeIT Memcached

这个笔者没用过,不做讲解了

下载完成,解压后会发现,enyim.com Memcached Client中,还包含了著名的Log4net日志框架。而Memcached Providers中其实包含了Enyim.Caching.dll,也包含了Log4netDLL。Memcached Providers更强大,MemcachedProviders是对Enyim.Caching的再次封装,并加入了客户端计数器功能以及Session数据库管理功能。。当然,使用和配置起来也同样简单,方便,只是对于一些负责的操作和处理方面,功能更强大一些。

如果只是简单的应用,推荐直接使用enyim.com Memcached Client。除了添加必要的Enyim.Caching.dll引用,还需要修改应用程序的配置文件。

下面我将贴出这两种方式的配置文件和测试代码:(放心,有详细的注释)

在Windows .NET平台下使用Memcached

测试代码(实现最简单的功能)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using Enyim.Caching;
  8. using MemcachedProviders.Cache;
  9. using System.Threading;
  10. namespace MemcachedProject
  11. {
  12. public partial class _Default : System.Web.UI.Page
  13. {
  14. protected void Page_Load(object sender, EventArgs e)
  15. {
  16. testMemcachedProviders();
  17. }
  18. /// <summary>
  19. /// 测试Enyim.Caching(注意:Enyim.Caching只具有MemcachedProviders的一部分功能,后者更强大。还可以集成Log4Net日志框架)
  20. /// </summary>
  21. public void testEnyimCaching()
  22. {
  23. MemcachedClient client = new MemcachedClient("enyim.com/memcached");
  24. //存值  --不带过期时间的存储,Memcached将根据LRU来决定过期策略
  25. bool result = client.Store(Enyim.Caching.Memcached.StoreMode.Add, "name", "dinglang");
  26. //带过期时间的缓存
  27. //bool success = client.Store(StoreMode.Add, person.UserName, person, DateTime.Now.AddMinutes(10));
  28. if (result)
  29. {
  30. Response.Write("成功存入缓存");
  31. //取值
  32. object name = client.Get("name");
  33. if (name != null)
  34. {
  35. Response.Write("取出的值为:"+name);
  36. }
  37. else
  38. {
  39. Response.Write("取值失败");
  40. }
  41. }
  42. else
  43. {
  44. Response.Write("存入缓存失败");
  45. }
  46. }
  47. /// <summary>
  48. /// 使用MemcachedProviders客户端
  49. /// </summary>
  50. public void testMemcachedProviders()
  51. {
  52. string key = "myName";
  53. string value = "Dylan";
  54. bool result =false;
  55. string val=string.Empty;
  56. #region 存/取最简单的数据类型
  57. //如果缓存中没有,就尝试着去存入缓存
  58. if (DistCache.Get(key) == null)
  59. {
  60. //DistCache.DefaultExpireTime = 1200;//缓存时间
  61. result = DistCache.Add(key, value);           //存数据
  62. if (result)
  63. {
  64. //如果存入成功,就试着去取
  65. Thread.Sleep(500);
  66. string ret = (string)DistCache.Get(key);            //读数据
  67. //Assert.AreEqual(value, ret);                     //验证
  68. if (ret != null)
  69. {
  70. Response.Write(ret);
  71. Response.Write("<br/>");
  72. }
  73. else
  74. {
  75. //取出来的值为null,直接移除该缓存对象
  76. DistCache.Remove(key);//移除
  77. // DistCache.RemoveAll();//移除所有
  78. }
  79. }
  80. }
  81. else {
  82. //缓存中有,直接拿数据
  83. string ret = (string)DistCache.Get(key);
  84. if (ret != null)
  85. {
  86. Response.Write(ret);
  87. Response.Write("<br/>");
  88. }
  89. else {
  90. DistCache.Remove(key);
  91. }
  92. }
  93. #endregion
  94. #region  存/取一个Person对象
  95. Person person = new Person() {Id=007,Name="Dylan"};//new 一个Person对象的实例
  96. //如果缓存中没有,则尝试着放入缓存
  97. if (DistCache.Get<Person>("myObj") == null)
  98. {
  99. result = DistCache.Add("myObj", person);
  100. if (result)
  101. {
  102. Thread.Sleep(500);
  103. val  = DistCache.Get("myObj").ToString();
  104. if (val != null) {
  105. Response.Write(val);
  106. Response.Write("<br/>");
  107. }
  108. else {
  109. DistCache.Remove("myObj");
  110. }
  111. }
  112. }
  113. else
  114. {
  115. //缓存中已经有该对象,就直接从缓存取
  116. Person p = DistCache.Get<Person>("myObj");
  117. val = person.ToString();
  118. //也可以直接这样取
  119. // val = DistCache.Get("myObj").ToString();
  120. if (val != null)
  121. {
  122. Response.Write(val);
  123. Response.Write("<br/>");
  124. }
  125. else
  126. {
  127. DistCache.Remove("myObj");
  128. }
  129. }
  130. #endregion
  131. }
  132. }
  133. }

Person类的定义代码:

  1. [Serializable]
  2. public class Person
  3. {
  4. private int id;
  5. public int Id
  6. {
  7. get { return id; }
  8. set { id = value; }
  9. }
  10. private string name;
  11. public string Name
  12. {
  13. get { return name; }
  14. set { name = value; }
  15. }
  16. /// <summary>
  17. /// 重写Tostring(),方便输出验证
  18. /// </summary>
  19. /// <returns></returns>
  20. public override string ToString()
  21. {
  22. return "Person:" + "{name:" + Name + ",id:" + Id + "}";
  23. }
  24. }

配置信息:

  1. <?xml version="1.0"?>
  2. <!--
  3. 有关如何配置 ASP.NET 应用程序的详细信息,请访问
  4. http://go.microsoft.com/fwlink/?LinkId=169433
  5. -->
  6. <configuration>
  7. <!--Enyim.Caching配置(省略了Log4Net框架)   For Memcached-->
  8. <!--<configSections>
  9. <sectionGroup name="enyim.com">
  10. <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
  11. </sectionGroup>
  12. </configSections>
  13. <enyim.com protocol="Binary">
  14. <memcached>
  15. <servers>
  16. <add address="127.0.0.1" port="11121"  />
  17. </servers>
  18. <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
  19. </memcached>
  20. </enyim.com>-->
  21. <!--The Enyim.Caching配置 End -->
  22. <!--MemcachedProviders的配置  -->
  23. <configSections>
  24. <section name="cacheProvider" type="MemcachedProviders.Cache.CacheProviderSection, MemcachedProviders"
  25. allowDefinition="MachineToApplication" restartOnExternalChanges="true"/>
  26. <sectionGroup name="enyim.com">
  27. <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
  28. </sectionGroup>
  29. <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  30. </configSections>
  31. <cacheProvider defaultProvider="MemcachedCacheProvider">
  32. <providers>
  33. <add name="MemcachedCacheProvider"
  34. type="MemcachedProviders.Cache.MemcachedCacheProvider, MemcachedProviders"  keySuffix="_MySuffix_" defaultExpireTime="2000"/>
  35. </providers>
  36. </cacheProvider>
  37. <enyim.com>
  38. <memcached>
  39. <servers>
  40. <!-- put your own server(s) here-->
  41. <add address="127.0.0.1" port="11121" />
  42. </servers>
  43. <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
  44. </memcached>
  45. </enyim.com>
  46. <log4net>
  47. <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
  48. <layout type="log4net.Layout.PatternLayout">
  49. <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}]- %message%newline" />
  50. </layout>
  51. </appender>
  52. <root>
  53. <priority value="WARN"/>
  54. <appender-ref ref="ConsoleAppender">
  55. <filter type="log4net.Filter.LevelRangeFilter">
  56. <levelMin value="WARN"/>
  57. <levelMax value="FATAL"/>
  58. </filter>
  59. </appender-ref>
  60. </root>
  61. </log4net>
  62. <!--The MemcachedProviders配置 End-->
  63. <connectionStrings>
  64. <add name="ApplicationServices"
  65. connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
  66. providerName="System.Data.SqlClient" />
  67. </connectionStrings>
  68. <system.web>
  69. <compilation debug="true" targetFramework="4.0" />
  70. <authentication mode="Forms">
  71. <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
  72. </authentication>
  73. <membership>
  74. <providers>
  75. <clear/>
  76. <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
  77. enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
  78. maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
  79. applicationName="/" />
  80. </providers>
  81. </membership>
  82. <profile>
  83. <providers>
  84. <clear/>
  85. <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
  86. </providers>
  87. </profile>
  88. <roleManager enabled="false">
  89. <providers>
  90. <clear/>
  91. <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
  92. <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
  93. </providers>
  94. </roleManager>
  95. </system.web>
  96. <system.webServer>
  97. <modules runAllManagedModulesForAllRequests="true"/>
  98. </system.webServer>
  99. </configuration>

好的,关于Memcached的基础部分,就先讲到这里。后续,我将会整理一些关于Memcached的高级技术,包括:复杂的存储(缓存/更新)控制模型,缓存策略,在分布式、集群、负载均衡的环境下的使用和管理技巧,性能监控,日志记录等.敬请期待。

本文出自blog.csdn.net/dinglang_2009,转载请注明出处。未经本人允许,任何人不得借此牟利。

Memcached系列文章汇总:

memcached单点故障与负载均衡

memcached性能监控

在Windows .NET平台上使用memcached

.NET中使用Memcached的相关资源整理

Memcached官方站点:http://www.danga.com/memcached/

Memcached Win32 1.2.6下载:http://code.jellycan.com/memcached/

安装帮助:Windows下的.NET+ Memcached安装

Memcached .NET客户端:

1).NET memcached client library

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

  相关文章:分布式缓存系统Memcached简介与实践

2)enyim.com Memcached Client

  下载地址:http://www.codeplex.com/EnyimMemcached/

  相关文章:memcached系列2:memcached实例  

3)Memcached Providers

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

  相关文章:.NET平台上的Memcached客户端介绍

4) BeIT Memcached

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

  相关文章:分布式缓存BeIT Memcached简介