在Windows .NET平台下使用Memcached

网上关于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的状态,如下图所示:

启动并配置好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引用,还需要修改应用程序的配置文件。

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Enyim.Caching;
using MemcachedProviders.Cache;
using System.Threading;

namespace MemcachedProject
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            testMemcachedProviders();
        }

        /// <summary>
        /// 测试Enyim.Caching(注意:Enyim.Caching只具有MemcachedProviders的一部分功能,后者更强大。还可以集成Log4Net日志框架)
        /// </summary>
        public void testEnyimCaching()
        {
            MemcachedClient client = new MemcachedClient("enyim.com/memcached");
            //存值  --不带过期时间的存储,Memcached将根据LRU来决定过期策略
            bool result = client.Store(Enyim.Caching.Memcached.StoreMode.Add, "name", "dinglang");
            //带过期时间的缓存
            //bool success = client.Store(StoreMode.Add, person.UserName, person, DateTime.Now.AddMinutes(10));
            if (result)
            {
                Response.Write("成功存入缓存");

                //取值
                object name = client.Get("name");
                if (name != null)
                {
                    Response.Write("取出的值为:"+name);
                }
                else
                {
                    Response.Write("取值失败");
                }
            }
            else
            {
                Response.Write("存入缓存失败");
            }
        }
        /// <summary>
        /// 使用MemcachedProviders客户端
        /// </summary>
        public void testMemcachedProviders()
        {
            string key = "myName";
            string value = "Dylan";
            bool result =false;
            string val=string.Empty;
            #region 存/取最简单的数据类型
            //如果缓存中没有,就尝试着去存入缓存
            if (DistCache.Get(key) == null)
            {
                //DistCache.DefaultExpireTime = 1200;//缓存时间
                result = DistCache.Add(key, value);           //存数据
                if (result)
                {
                    //如果存入成功,就试着去取
                    Thread.Sleep(500);
                    string ret = (string)DistCache.Get(key);            //读数据
                    //Assert.AreEqual(value, ret);                     //验证
                    if (ret != null)
                    {
                        Response.Write(ret);
                        Response.Write("<br/>");
                    }
                    else
                    {
                    //取出来的值为null,直接移除该缓存对象
                        DistCache.Remove(key);//移除
                       // DistCache.RemoveAll();//移除所有
                    }
                }
            }
            else {
                //缓存中有,直接拿数据
                string ret = (string)DistCache.Get(key);
                if (ret != null)
                {
                    Response.Write(ret);
                    Response.Write("<br/>");
                }
                else {
                    DistCache.Remove(key);
                }
            }
            #endregion

            #region  存/取一个Person对象
            Person person = new Person() {Id=007,Name="Dylan"};//new 一个Person对象的实例
           //如果缓存中没有,则尝试着放入缓存
            if (DistCache.Get<Person>("myObj") == null)
          {
              result = DistCache.Add("myObj", person);
              if (result)
              {
                  Thread.Sleep(500);
                   val  = DistCache.Get("myObj").ToString();
                  if (val != null) {
                      Response.Write(val);
                      Response.Write("<br/>");
                  }
                  else {
                      DistCache.Remove("myObj");
                  }

              }
          }
          else
          {
              //缓存中已经有该对象,就直接从缓存取
              Person p = DistCache.Get<Person>("myObj");
              val = person.ToString();
                //也可以直接这样取
             // val = DistCache.Get("myObj").ToString();

              if (val != null)
              {
                  Response.Write(val);
                  Response.Write("<br/>");
              }
              else
              {
                  DistCache.Remove("myObj");
              }

          }
            #endregion
        }
    }
}

Person类的定义代码:

 [Serializable]
    public class Person
    {
        private int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        /// <summary>
        /// 重写Tostring(),方便输出验证
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return "Person:" + "{name:" + Name + ",id:" + Id + "}";
        }
    }

配置信息:

<?xml version="1.0"?>

<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>

  <!--Enyim.Caching配置(省略了Log4Net框架)   For Memcached-->

  <!--<configSections>
    <sectionGroup name="enyim.com">
      <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
    </sectionGroup>
  </configSections>
  <enyim.com protocol="Binary">
    <memcached>
      <servers>
        <add address="127.0.0.1" port="11121"  />
      </servers>
      <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
    </memcached>
  </enyim.com>-->

  <!--The Enyim.Caching配置 End -->

  <!--MemcachedProviders的配置  -->
  <configSections>
  <section name="cacheProvider" type="MemcachedProviders.Cache.CacheProviderSection, MemcachedProviders"
        allowDefinition="MachineToApplication" restartOnExternalChanges="true"/>
  <sectionGroup name="enyim.com">
    <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
  </sectionGroup>
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <cacheProvider defaultProvider="MemcachedCacheProvider">
    <providers>
      <add name="MemcachedCacheProvider"
     type="MemcachedProviders.Cache.MemcachedCacheProvider, MemcachedProviders"  keySuffix="_MySuffix_" defaultExpireTime="2000"/>
    </providers>
  </cacheProvider>
  <enyim.com>
    <memcached>
      <servers>
        <!-- put your own server(s) here-->
        <add address="127.0.0.1" port="11121" />
      </servers>
      <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
    </memcached>
  </enyim.com>

  <log4net>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}]- %message%newline" />
      </layout>
    </appender>
    <root>
      <priority value="WARN"/>
      <appender-ref ref="ConsoleAppender">
        <filter type="log4net.Filter.LevelRangeFilter">
          <levelMin value="WARN"/>
          <levelMax value="FATAL"/>
        </filter>
      </appender-ref>
    </root>
  </log4net>

  <!--The MemcachedProviders配置 End-->

  <connectionStrings>
    <add name="ApplicationServices"
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />

    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>

    <membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />
      </providers>
    </membership>

    <profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
      </providers>
    </profile>

    <roleManager enabled="false">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
      </providers>
    </roleManager>

  </system.web>

  <system.webServer>
     <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

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

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

Memcached系列文章汇总:

memcached单点故障与负载均衡

memcached性能监控

在Windows .NET平台上使用memcached

时间: 2024-08-21 18:39:49

在Windows .NET平台下使用Memcached的相关文章

JDK 7U15在 Windows x86平台下的安装方法_java

这里以JDK 7U15在 Windows x86平台下的安装为例,其他平台安装与此类同. 下载JDK请查看:JDK最新下载地址[含下载方法] ①JDK 7U15下载完成后,是一个可执行文件,如图所示: ②双击运行该安装程序,出现如下界面: ③点击"下一步",出现如下界面: ④可以看到,JDK包含了Java开发工具.源代码(基础类库)和公共JRE,这三项都是默认安装的,是Java开发所必须的,缺一不可.这里,可以更改JDK的安装目录.选择好安装目录,点击"下一步",进

不同WINDOWS平台下磁盘逻辑扇区的直接读写

不同WINDOWS平台下磁盘逻辑扇区的直接读写 关键字:VWIN32.中断.DeviceIoControl 一.概述 在DOS操作系统下,通过BIOS的INT13.DOS的INT25(绝对读).INT26(绝对写)等功能调用实现对磁盘逻辑扇区或物理扇区的读写是很方便的,C语言中还有对应上述功能调用的函数:biosdisk.absread和abswrite等.但在WINDOWS操作系统下编写WIN32应用程序时却再也不能直接使用上述的中断调用或函数了.那么,在WINDOWS操作系统下能不能实现磁盘

postgresql在windows平台下的安装

window 经过了一天一夜的折磨,终于让postgresql正常的运行在我的计算机上了,尽管还有些不稳定,但总算是可以用了,废话少说,下面就说说我的配置过程: 1.搞来最新的postgresql for windows版本的,我用的是7.31(***,这个怎么象鬼子的那个细菌部队?打倒日本帝国主义!!!),开始默认安装.不知道为什么这个鸟玩艺儿为什么不能选择安装路径,也许是我没有找到?不过我前前后后安装了二十几遍也没有发现,如果那位大虾发现了请告诉我一声,^O^.安装完成了呢,系统会提示你重新

Windows及Linux平台下的计时函数总结

本文对Windows及Linux平台下常用的计时函数进行总结,包括精度为秒.毫秒.微秒三种精度的各种函数. 比如Window平台下特有的Windows API函数GetTickCount().timeGetTime().及QueryPerformanceCounter(), Linux平台下特有的gettimeofday()函数,以及标准的C/C++函数time()和clock().下面分别对此进行简单介绍并附上示例代码. 通用的C/C++计时函数time()和clock() time_t ti

请问windows的.net平台下比较好的轻量级插件式框架,哪个比较好?

问题描述 请问windows的.net平台下比较好的轻量级插件式框架,哪个比较好? 请问.net平台下比较好的轻量级插件式框架,哪个比较好? 比如SCSF,MEF等 解决方案 FireBreath还不错,可以试试啊

Windows平台下安装MongoDB

MongoDB以其操作简单.完全免费.源码公开.随时下载等特点,被广泛应用于各种大型门户网站和专业网站,大大降低了运营成本.本文描述了在Widows平台下的安装步骤及其过程,供大家参考. 一.主要步骤 1.查看当前使用的Windows版本及架构 wmic os get caption wmic os get osarchitecture 2.下载对应的版本 http://www.mongodb.org/downloads 3.配置mongdb 创建存放数据文件的路径 md \data\db Yo

这个程序在windows平台下能正常输出,结果也是对的。到linux下运行在50行产生数组溢出是怎么回事呢

问题描述 importjava.io.*;importjava.util.*;publicclassRout{publicstaticvoidmain(String[]args){//StringfilePath="d:\java\javatest\rout.txt";intreadLine[];readLine=newint[14];StringreadResult[]=newString[14];BufferedReaderreader=null;try{FileReaderfil

安装WMware 在Windows平台下学习Linux

为了更加方便在Windows平台下学习Linux,我们在这装个虚拟机 安装前准备:虚拟机 推荐使用:VMware 下载链接:http://pan.baidu.com/s/1eQxOVPC 安装WMware流程如下: *不建议更改安装目录,默认就行.否则会出问题,反正我是出过   *许可证秘钥请百度:VMware 10 秘钥 本文作者:佚名 来源:51CTO

在Windows平台下修改Oracle实例不随服务启动

一.在Windows平台下修改Oracle实例不随服务启动: 1.修改注册表如下键值实现: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_OraDb10g_home1 2.在右边找到找到 ORA_WWL_AUTOSTART项,默认这个值为TRUE,随服务启动而启动,我们将其改为FALSE,再起服务的时候将不再会启动数据库 测试: 启动Oracle服务 C:\>net start OracleServiceWWL OracleServiceWWL 服务正在启动 .