memcached win64 1.4.4-14
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 852STAT uptime 1399STAT time 1300979378STAT version 1.2.5STAT pointer_size 32STAT curr_items 0STAT total_items 0STAT bytes 0STAT curr_connections 3STAT total_connections 5STAT connection_structures 4STAT cmd_get 0STAT cmd_set 0STAT get_hits 0STAT get_misses 0STAT evictions 0STAT bytes_read 23STAT bytes_written 415STAT limit_maxbytes 67108864STAT threads 1END通过这个数据我们就可以了解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,可以到下载最新的版本。要想在项目中使用Memcached,需要添加对Enyim.Caching.dll的应用。除此之外,我们可能还需要在config文件中配置Memcached的信息(也可以在程序代码中指定,但那样不灵活),如下就是一个config文件配置的例子:如果我们配置了多个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://blog.csdn.net/zhoufoxcn 或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说 明:如果需要一次从Memcached中取回多个缓存的数据,可以参考MultiGetDemo()方法,这样一来只需要一次网络通讯就可以取回全部数 据,减少网络连接时间。此外,在Memcached客户端可以使用Text或者Binary协议,经过周公千万次测试比较,使用Binary协议性能略高 于使用Text协议。在上面的config文件中周公就配置使用了Binary协议。总结,使用Memcached这样的分布式缓存可以大大提高应用程序的性能,经过周公测试,正确使用Memcached可以将单台服务器的并发访问数从20提高到1000左右,也就是提高了50倍,这是一个相当客观的提升!("李刚"); if (person != null) { Console.WriteLine("取回[{0}]的结果——UserId:{1},UserName:{2}", "李刚", person.UserId, person.UserName); } else { Console.WriteLine("取回[{0}]失败!", "李刚"); } } public void MultiGetDemo() { List personNameList = new List (); for (int i = 0; i < 10; i++) { personNameList.Add("李刚00" + i); } //批量获取,只通过一次网络通讯就取回所有personNameList中的指定的所有数据 IDictionary resultList = client.Get(personNameList); Person person; foreach (KeyValuePair 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}]失败!", "李刚"); } } } } }
C# 下可用的API(每个客户端API中都有详细的说明和注释)
- Client developed in .NET 2.0 keeping performance and extensibility inmind. (Supports consistent hashing.)
- Client developed by BeIT with many new features