memcached安装使用

本文介绍Memcached缓存服务在Windows下的安装步骤及如何使用Enyim.Caching和MemcachedProviders作为.NET客户端进行数据操作。包括安装、配置、基本命令及客户端API示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.下载

windows下的 http://download.csdn.net/detail/flxyzsby/3941243 安装的exe文件。(此exe文件已经打包了所需的dll了,即exe中包含dll组件)

2.安装步骤

>一、缓存服务Memcached-1.4.5(W64)安装步骤:

 

1. 将Memcached-1.4.5(W64)解压放某个盘下面,比如在

E:\ApabiCourse\memcached\memcached-1.4.5(W64).exe;


2. 在运行中启动CMD,然后输入

【“E:\ApabiCourse\memcached\memcached-1.4.5(W64).exe” -d install】 安装;


3. 在运行下输入“regedit”打开注册表,  找到路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached,下面找到一个ImagePath 的字符串项,正好是服务的执行路径的字符串,双击该串,在后面追加入“-m 2048 -c 20000”( 使用2048M内存,链接数为20000)。


4. 再输入:【“E:\ApabiCourse\memcached\memcached-1.4.5(W64).exe”-d start】启动。 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。


检测是否安装成功


5.检测服务是否可用:

 执行cmd命令,启动telnet到memcached服务所在的ip的端口,例如【telnet 172.18.89.5 11211】,其中,11211是memcached的默认端口


输入stats,即可看到下图,证明安装服务成功。

 





常用命令:
  1. 将memcached.exe安装为Windows服务:memcached.exe -d install
  2. 启动memcached服务:memcached.exe -d start
  3. 启动memcached服务(windows命令):net start "memcached Server"
  4. 停止memcached服务(windows命令):net stop "memcached Server"
  5. 连接到memcached控制台:telnet ServerIP 11211
  6. 打印当前memcached服务器状态:stats
  7. 打印当前memcached服务器Items(记录)的统计信息:stats items
  8. 打印当前memcached服务器Slab(分区)及Chunk(块)的统计信息:stats slabs
  9. 打印指定Slab中的KEY列表(可用于遍历items,但效率较低,慎用!):stats cachedump SlabId Limit_num。显示结果:ITEM KeyName [ValueByteLength b; LastAccessTime s]。值得注意的是,经过测试确认:那个LastAccessTime并不是记录到期时间,而是最后一次的get时间,并且get之后,也不会自动延长expiry到期时间)。
  10. 添加新记录:add KeyName 0 0 ValueByteLength [回车] ValueContent
  11. 删除记录 : delete KeyName
  12. 添加或更新记录 : set KeyName 0 0 ValueByteLength [回车] ValueContent
  13. 更新记录 : replace KeyName 0 0 ValueByteLength [回车] ValueContent

通过这个数据我们就可以了解Memcached的状态了。 
这些数据所代表的意义如下: 
pid:32u,服务器进程ID。 
uptime:32u, 服务器运行时间,单位秒。 
time :32u, 服务器当前的UNIX时间。 
version :string, 服务器的版本号。 
curr_items :32u, 服务器当前存储的内容数量 Current number of items stored by the server 
total_items :32u, 服务器启动以来存储过的内容总数。 
bytes :64u, 服务器当前存储内容所占用的字节数。 
curr_connections :32u, 连接数量。 
total_connections :32u, 服务器运行以来接受的连接总数。 
connection_structures:32u, 服务器分配的连接结构的数量。 
cmd_get :32u, 取回请求总数。 
cmd_set :32u, 存储请求总数。 
get_hits :32u, 请求成功的总次数。 
get_misses :32u, 请求失败的总次数。 
bytes_read :64u, 服务器从网络读取到的总字节数。 
bytes_written :64u, 服务器向网络发送的总字节数。 
limit_maxbytes :32u, 服务器在存储时被允许使用的字节总数。 

上面的描述中32u和64u表示32位和64位无符号整数,string表示是string类型数据。

三、memcache客户端的安装(.net版本)

 enyim.com Memcached Client

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

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

 

下载enyim.com Memcached Client 和 Memcached Providers,解压后会发现,enyim.com Memcached Client中,还包含了著名的Log4net日志框架。

而Memcached Providers中其实包含了Enyim.Caching.dll,也包含了Log4netDLL

Memcached Providers更强大,MemcachedProviders是对Enyim.Caching的再次封装,并加入了客户端计数器功能以及Session数据库管理功能

当然,使用和配置起来也同样简单,方便,只是对于一些负责的操作和处理方面,功能更强大一些。

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

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

image

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

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类的定义代码:
这里需要说明的是如果我们需要向Memcached中添加自定义数据类型时,我们需要将该数据类型添加上[Serializable]标记。

[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 + "}"; } }
web.config 配置信息:
<?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  配置结束,下面的都是一些其他的配置,例如连数据库之类的,和我们的  memcache 无关-->

    <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>




http://blog.csdn.net/flxyzsby/article/details/6430106 Windows下编译memcached-1.4.5(32bit和64bit) 


http://www.cnblogs.com/whoknows/articles/memcache_php5-3-10_win32.html  introduce


http://blog.couchbase.com/memcached-144-windows-32-bit-binary-now-available  down


http://www.cnblogs.com/luminji/archive/2011/08/17/2140804.html  winform example



http://www.cnblogs.com/zhoufoxcn/archive/2011/03/27/2515609.html  周公


http://code.google.com/p/memcached/wiki/NewServerMaint google

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值