memcached win64 1.4.4-14 http://pan.baidu.com/s/1qWsL7Ve

mencached官网  http://memcached.org/

 

安装Memcache Server(也可以不安装直接启动)

1.解压memcached-win64-1.4.4-14.zip 比如 D:\memcached

2. 在CMD下输入 "D:\memcached\memcached.exe -d install" 安装.
3. 再输入:"D:\memcached\memcached.exe -d start" 启动。  NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。

 

启动该服务后,memcached服务默认占用的端口是11211,占用的最大内存默认是64M。

打开windows服务控制面板一看,发现memcached.exe 默认安装的服务器启动参数中根本没写-p -m的参数,只有1个 -d runservice参数。
所以不管用什么命令启动服务都是没用的,见下图:


显然有时候是不符合要求的,这里把最大内存设置大些及更改端口

于是就想到直接修改windows服务的启动参数,操作如下,打开注册表,找到:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server
其中的ImagePath项的值为:"D:\memcached\memcached.exe" -d runservice
改成:"D:\memcached\memcached.exe" -p 12345 -m 1024 -d runservice

保存后重新启动memcached服务,然后在命令行中输入netstat -n -a  看看现在端口是不是改啦

 

常用设置:
-p <num>          监听的端口
-l <ip_addr>      连接的IP地址, 默认是本机
-d start          启动memcached服务
-d restart        重起memcached服务
-d stop|shutdown  关闭正在运行的memcached服务
-d install        安装memcached服务
-d uninstall      卸载memcached服务
-u <username>     以<username>的身份运行 (仅在以root运行的时候有效)
-m <num>          最大内存使用,单位MB。默认64MB
-M                内存耗尽时返回错误,而不是删除项
-c <num>          最大同时连接数,默认是1024
-f <factor>       块大小增长因子,默认是1.25
-n <bytes>        最小分配空间,key+value+flags默认是48
-h                显示帮助

然后就可以用.net 的memcached客户端来试一下了。

 

在调试程序时可以使用下面的命令行来运行:

memcached.exe -p 11121 -m 64 -vv

这样就会看到如下的结果:

slab class   1: chunk size     88 perslab 11915

slab class   2: chunk size    112 perslab  9362

slab class   3: chunk size    144 perslab  7281

slab class   4: chunk size    184 perslab  5698

slab class   5: chunk size    232 perslab  4519

slab class   6: chunk size    296 perslab  3542

slab class   7: chunk size    376 perslab  2788

slab class   8: chunk size    472 perslab  2221

slab class   9: chunk size    592 perslab  1771

slab class  10: chunk size    744 perslab  1409

slab class  11: chunk size    936 perslab  1120

slab class  12: chunk size   1176 perslab   891

slab class  13: chunk size   1472 perslab   712

slab class  14: chunk size   1840 perslab   569

slab class  15: chunk size   2304 perslab   455

slab class  16: chunk size   2880 perslab   364

slab class  17: chunk size   3600 perslab   291

slab class  18: chunk size   4504 perslab   232

slab class  19: chunk size   5632 perslab   186

slab class  20: chunk size   7040 perslab   148

slab class  21: chunk size   8800 perslab   119

slab class  22: chunk size  11000 perslab    95

slab class  23: chunk size  13752 perslab    76

slab class  24: chunk size  17192 perslab    60

slab class  25: chunk size  21496 perslab    48

slab class  26: chunk size  26872 perslab    39

slab class  27: chunk size  33592 perslab    31

slab class  28: chunk size  41992 perslab    24

slab class  29: chunk size  52496 perslab    19

slab class  30: chunk size  65624 perslab    15

slab class  31: chunk size  82032 perslab    12

slab class  32: chunk size 102544 perslab    10

slab class  33: chunk size 128184 perslab     8

slab class  34: chunk size 160232 perslab     6

slab class  35: chunk size 200296 perslab     5

slab class  36: chunk size 250376 perslab     4

slab class  37: chunk size 312976 perslab     3

slab class  38: chunk size 391224 perslab     2

slab class  39: chunk size 489032 perslab     2

<96 server listening

<112 server listening

<116 send buffer was 8192, now 268435456

<116 server listening (udp)

 

在客户端还可以通过telnet来查看和操作Memcached,前提是服务器端和客户端都支持Telnet协议,在Windows7和Windows2008中默认都不支持,需要在控制面板中安装和启用。
首先打开控制面板,然后点击“打开或关闭Windows功能”

点击“打开或关闭Windows功能”之后会看到当前系统启用的功能的状态,根据当前机器选择打开Telnet服务器端或者客户端功能

经过上面的操作之后就可以在客服端远程查看Memcached的状态或者操作Memcached了。下面的命令就是连接到Memcached:
telnet localhost 11121
连接之后会出现一个命令行窗口,在这个命令行窗口中输入"stats"就可以看到当前Memcached的状态,如下就是刚刚启动的Memcached的状态数据:
STAT pid 852
STAT uptime 1399
STAT time 1300979378
STAT version 1.2.5
STAT pointer_size 32
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT curr_connections 3
STAT total_connections 5
STAT connection_structures 4
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT evictions 0
STAT bytes_read 23
STAT bytes_written 415
STAT limit_maxbytes 67108864
STAT threads 1
END
通过这个数据我们就可以了解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类型数据。


在.NET中应用Memcached
有很多.NET版本的Memcached客户端程序,在这里周公使用的Enyim Memcached,可以到https://github.com/enyim/EnyimMemcached/下载最新的版本。
要想在项目中使用Memcached,需要添加对Enyim.Caching.dll的应用。除此之外,我们可能还需要在config文件中配置Memcached的信息(也可以在程序代码中指定,但那样不灵活),如下就是一个config文件配置的例子:
 

<?xml version="1.0" encoding="utf-8" ?> <configuration>   <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="localhost" port="11121" />         <!--<add address="localhost" port="11131" />         <add address="localhost" port="11141" />         <add address="localhost" port="11151" />-->       </servers>       <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />     </memcached>   </enyim.com> </configuration>


如果我们配置了多个Memcached的实例,可以想上面的注释部分那样在<servers>节点下添加多个Memcached的实例配置。
这里需要说明的是如果我们需要向Memcached中添加自定义数据类型时,我们需要将该数据类型添加上[Serializable]标记。
下面是一个Enyim Memcached的例子:
 

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using Enyim.Caching;  using Enyim.Caching.Memcached;  /*   * 作者:周公(zhoufoxcn)   * 日期:2011-03-24   *  或http://zhoufoxcn.blog.51cto.com   * 版权说明:本文可以在保留原文出处的情况下使用于非商业用途,周公对此不作任何担保或承诺。   * */ namespace MemcachedMonitor  {  [Serializable]  public class Person  {      public int UserId { get; set; }      public string UserName { get; set; }  }  public class MemcachedDemo  {      private static MemcachedClient client = new MemcachedClient("enyim.com/memcached");       public void SetDemo()      {          Person person = new Person { UserId = 1, UserName = "李刚" };          //不带过期时间的存储,Memcached将根据LRU来决定过期策略          bool success=client.Store(StoreMode.Add, person.UserName, person);          //带过期时间的缓存          //bool success = client.Store(StoreMode.Add, person.UserName, person, DateTime.Now.AddMinutes(10));          Console.WriteLine("存储[{0}]的结果:{1}", person.UserName, success);      }       public void GetDemo()      {          Person person = client.Get<Person>("李刚");          if (person != null)          {              Console.WriteLine("取回[{0}]的结果——UserId:{1},UserName:{2}", "李刚", person.UserId, person.UserName);          }          else         {              Console.WriteLine("取回[{0}]失败!", "李刚");          }      }       public void MultiGetDemo()      {          List<string> personNameList = new List<string>();          for (int i = 0; i < 10; i++)          {              personNameList.Add("李刚00" + i);          }          //批量获取,只通过一次网络通讯就取回所有personNameList中的指定的所有数据          IDictionary<string, object> resultList = client.Get(personNameList);          Person person;          foreach (KeyValuePair<string, object> item in resultList)          {              person = item.Value as Person;              if (person != null)              {                  Console.WriteLine("取回[{0}]的结果——UserId:{1},UserName:{2}", "李刚", person.UserId, person.UserName);              }              else             {                  Console.WriteLine("取回[{0}]失败!", "李刚");              }          }      }  }  }


说 明:如果需要一次从Memcached中取回多个缓存的数据,可以参考MultiGetDemo()方法,这样一来只需要一次网络通讯就可以取回全部数 据,减少网络连接时间。此外,在Memcached客户端可以使用Text或者Binary协议,经过周公千万次测试比较,使用Binary协议性能略高 于使用Text协议。在上面的config文件中周公就配置使用了Binary协议。
总结,使用Memcached这样的分布式缓存可以大大提高应用程序的性能,经过周公测试,正确使用Memcached可以将单台服务器的并发访问数从20提高到1000左右,也就是提高了50倍,这是一个相当客观的提升!

C# 下可用的API(每个客户端API中都有详细的说明和注释)

https://sourceforge.net/projects/memcacheddotnet/
http://www.codeplex.com/EnyimMemcached/ - Client developed in .NET 2.0 keeping performance and extensibility in

mind. (Supports consistent hashing.) 
http://code.google.com/p/beitmemcached/ - Client developed by BeIT with many new features