关于分布式缓存Memcached详解

作者:袖梨 2022-06-25

关于分布式缓存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。

相关文章

精彩推荐