关于分布式缓存memcached详解
libevent事件机制
memcached基于libevent事件处理,用相关资料上描述,libevent是个程序库,它将linux的epoll、bsd类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥o(1)的性能。
memcached服务器,缓存数据都是以key-value hash表的内存存储,最大key不超过250个字符,最大value项默认不超过1m,因此重启程序和服务器都会导致数据丢失,但它会消耗更低的cpu,因此可以用配置一般内存大点的服务器作为memcached服务器。在内容超过制定缓存大小后,会用lru,最近最少使用算法删除不使用的数据,默认超时时间为30天。memcached服务器之间互不通信,分布式算法在客户端,由客户端选择把数据存储到哪台memcached 服务器上,比如.net客户端,一般默认采用key的hashcode来模memcached服务器数量取余的值,作为选择当前key-value存储的服务器,当然系统足够庞大后,可以编写更加复杂和为具体项目做的算法。
现在根据.net客户端的接口,可以直接写个demo代码,代码如下:
1 static void main(string[] args)
2
3 {
4
5 //可以通过app.config配置
6
7 string[] serverlist = { "127.0.0.1:11211" };
8
9 //多个如下:
10
11 //string[] serverlist = { "127.0.0.1:11211,192.168.1.1:11211" };
12
13
14
15 sockiopool pool = sockiopool.getinstance();
16
17 pool.setservers(serverlist);
18
19
20
21 //pool.initconnections = 3;
22
23 //pool.minconnections = 3;
24
25 //pool.maxconnections = 5;
26
27
28
29 //pool.socketconnecttimeout = 1000;
30
31 //pool.sockettimeout = 3000;
32
33
34
35 //pool.maintenancesleep = 30;
36
37 //pool.failover = true;
38
39 //pool.nagle = false;
40
41
42
43 pool.initialize();
44
45
46
47 memcachedclient mc = new memcachedclient();
48
49 mc.enablecompression = false;
50
51
52
53 //mc.flushall();
54
55
56
57 string input = "test of string";
58
59 mc.set("foo", input);
60
61 string s = (string)mc.get("foo");
62
63
64
65 mc.add("foo", "foo2");
66
67
68
69 datas d = new datas();
70
71 d.a = 2;
72
73 d.b = "222222";
74
75
76
77 //d.c = new byte[1024*1024*2];
78
79
80
81 mc.set("classv", d);
82
83
84
85 datas d2 = (datas)mc.get("classv");
86
87
88
89 console.readkey();
90
91 }
不同版本的客户端,接口不一样,但思想基本一样,sockiopool设置服务器列表,代理里有部分注释,可以参考。memcachedclient创建一个对象,就可以用了,它提供get,set,add,delete等方法,这里需要注意,如果同一个key已经有值了,再用add将不能修改,该方法会返回false,表示没有插入服务器,因此建议用set,像服务器添加值由于最大有默认1m限制,因此超过1m,也会插入不成功,返回false
下面我以windows下memcached 服务器和.net的memcached客户端为例,介绍下它的安装和使用。
我用的windows下memcached1.2.6版本,在http://code.jellycan.com/memcached/可以下载,.net客户端采用的https教程://sourceforge.net/projects/memcacheddotnet/下的开源客户端,当然也可以参考memcached服务器的协议接口,编写自定义的客户端。
下载好memcached服务器端后,解压到比如d:memcached-1.2.6,在cmd命令控制台下,输入d:memcachedmemcached.exe -d install就安装好memcached的windows服务,然后输入d:memcachedmemcached.exe -d start则启动该服务,客户端就可以连接了,默认端口是11211,最大内存为64m,一般会修改,输入d:memcachedmemcached.exe -p 12345 -m 1024 -d start,其中-d install 安装为windows服务, -m 使用的最大内存(mb),默认64m, 还有-l 绑定的ip,-c 最大并发连接数,默认1024,但一般不会起作用,需要修改注册表,在注册表找到hkey_local_machinesystemcurrentcontrolsetservicesmemcached server, 找到imagepath项,把"d:memcachedmemcached.exe" -d runservice的后面加上-p 11111 -m 1024 -c 2048,重启后则把端口改为11111,最大内存为1024m。