您好,欢迎访问一九零五行业门户网

Memcached服务器安装、配置、使用详解

我使用的是centos 6.4系统,安装的memcached版本为1.4.20。这里,记录一下安装配置的过程,以及如何使用一些常用的客户端来访问memcached存储的数据。 安装配置 首先,编译、安装、配置libevent库,执行如下命令: wget https://github.com/downloads/libeve
我使用的是centos 6.4系统,安装的memcached版本为1.4.20。这里,记录一下安装配置的过程,以及如何使用一些常用的客户端来访问memcached存储的数据。
安装配置
首先,编译、安装、配置libevent库,执行如下命令:
wget https://github.com/downloads/libevent/libevent/libevent-1.4.14b-stable.tar.gztar xvzf libevent-1.4.14b-stable.tar.gzln -s /usr/local/libevent-1.4.14b-stable /usr/local/libeventcd /usr/local/libevent./configuremakemake install
然后,编译、安装、配置memcached,执行如下命令行:
wget http://www.memcached.org/files/memcached-1.4.20.tar.gztar xvzf memcached-1.4.20.tar.gzln -s /usr/local/memcached-1.4.20 /usr/local/memcached./configure --with-libevent=/usr/local/libevent/makemake install
如果没有出错,安装成功。
管理memcached服务
启动memcached一般情况下,简单地可以使用类似如下形式,启动memcached服务:
/usr/local/bin/memcached -d -m 64 -i 20m -u root -l 192.168.4.86 -p 11211 -c 1024 -p /usr/local/memcached/memcached.pid
上述命令行中,基于上面各个选项,以及其他一些选项的含义,说明如下表所示:
选项 含义说明
-d 指定memcached进程作为一个守护进程启动
-m 指定分配给memcached使用的内存,单位是mb
-u 运行memcached的用户
-l 监听的服务器ip地址,如果有多个地址的话,使用逗号分隔,格式可以为“ip地址:端口号”,例如:-l 指定192.168.0.184:19830,192.168.0.195:13542;端口号也可以通过-p选项指定
-p memcached监听的端口,要保证该端口号未被占用
-c 设置最大运行的并发连接数,默认是1024
-r 为避免客户端饿死(starvation),对连续达到的客户端请求数设置一个限额,如果超过该设置,会选择另一个连接来处理请求,默认为20
-k 设置锁定所有分页的内存,对于大缓存应用场景,谨慎使用该选项
-p 保存memcached进程的pid文件
-s 指定memcached用于监听的unix socket文件
-a 设置-s选项指定的unix socket文件的权限
-u 指定监听udp的端口,默认11211,0表示关闭
-m 当内存使用超出配置值时,禁止自动清除缓存中的数据项,此时memcached不可以,直到内存被释放
-r 设置产生core文件大小
-f 用于计算缓存数据项的内存块大小的乘数因子,默认是1.25
-n 为缓存数据项的key、value、flag设置最小分配字节数,默认是48
-c 禁用cas
-h 显示memcached版本和摘要信息
-v 输出警告和错误信息
-vv 打印信息比-v更详细:不仅输出警告和错误信息,也输出客户端请求和响应信息
-i 打印libevent和memcached的licenses信息
-t 指定用来处理请求的线程数,默认为4
-d 用于统计报告中key前缀和id之间的分隔符,默认是冒号“:”
-l 尝试使用大内存分页(pages)
-b 指定使用的协议,默认行为是自动协商(autonegotiate),可能使用的选项有auto、ascii、binary。
-i 覆盖默认的stab页大小,默认是1m
-f 禁用flush_all命令
-o 指定逗号分隔的选项,一般用于用于扩展或实验性质的选项
停止memcached可以通过linux的如下命令查询到memcached的进程号:
ps -ef | grep memcached
然后杀掉memcached服务进程:
kill -9
-9表示强制杀掉进程。
memcached启动以后,可以通过客户端来操作缓存中的数据,我们说明一些常用的客户端,及其使用方法。
telnet客户端
telnet客户端可以通过命令行的方式来监控查看memcached服务器存储数据的情况。例如,memcached的服务地址为192.168.4.86:11211,可以telnet到该服务端口:
telnet 192.168.4.86 11211
如果连接成功,可以使用如下一些命令:
stats命令该命令用于显示服务器信息、统计数据等,结果示例数据(来自www.2cto.com网站),例如:
stat pid 22362 //memcache服务器的进程id www.2cto.com stat uptime 1469315 //服务器已经运行的秒数stat time 1339671194 //服务器当前的unix时间戳stat version 1.4.9 //memcache版本stat libevent 1.4.9-stable //libevent版本stat pointer_size 64 //当前操作系统的指针大小(32位系统一般是32bit,64就是64位操作系统)stat rusage_user 3695.485200 //进程的累计用户时间stat rusage_system 14751.273465 //进程的累计系统时间stat curr_connections 69 //服务器当前存储的items数量stat total_connections 855430 //从服务器启动以后存储的items总数量stat connection_structures 74 //服务器分配的连接构造数stat reserved_fds 20 //stat cmd_get 328806688 //get命令(获取)总请求次数stat cmd_set 75441133 //set命令(保存)总请求次数 www.2cto.com stat cmd_flush 34 //flush命令请求次数stat cmd_touch 0 //touch命令请求次数stat get_hits 253547177 //总命中次数stat get_misses 75259511 //总未命中次数stat delete_misses 4 //delete命令未命中次数stat delete_hits 565730 //delete命令命中次数stat incr_misses 0 //incr命令未命中次数stat incr_hits 0 //incr命令命中次数stat decr_misses 0 //decr命令未命中次数stat decr_hits 0 //decr命令命中次数stat cas_misses 0 //cas命令未命中次数stat cas_hits 0 //cas命令命中次数stat cas_badval 0 //使用擦拭次数stat touch_hits 0 //touch命令未命中次数stat touch_misses 0 //touch命令命中次数stat auth_cmds 0 //认证命令处理的次数stat auth_errors 0 //认证失败数目stat bytes_read 545701515844 //总读取字节数(请求字节数)stat bytes_written 1649639749866 //总发送字节数(结果字节数)stat limit_maxbytes 2147483648 //分配给memcache的内存大小(字节)stat accepting_conns 1 //服务器是否达到过最大连接(0/1)stat listen_disabled_num 0 //失效的监听数stat threads 4 //当前线程数stat conn_yields 14 //连接操作主动放弃数目stat hash_power_level 16 //stat hash_bytes 524288stat hash_is_expanding 0stat expired_unfetched 30705763stat evicted_unfetched 0stat bytes 61380700 //当前存储占用的字节数stat curr_items 28786 //当前存储的数据总数stat total_items 75441133 //启动以来存储的数据总数stat evictions 0 //为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)stat reclaimed 39957976 //已过期的数据条目来存储新数据的数目end
上面给出了各个统计项的含义说明,不再累述。
stats命令有几个二级子项,说明如下表所示:
命令 含义说明
stats slabs 显示各个slab的信息,包括chunk的大小、数目、使用情况等
stats items 显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)
stats detail [on|off|dump] 设置或者显示详细操作记录;
参数为on,打开详细操作记录;
参数为off,关闭详细操作记录;
参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)
stats malloc 打印内存分配信息
stats sizes 打印缓存使用信息
stats reset 重置统计信息
下面的命令,我们通过表格的形式说明,如下表所示:
命令 用法格式 含义说明 示例
get get *\r\n 用于获取缓存的数据,键为key。 get name
value name 0 7
shirdrn
end
gets gets *\r\n 用于获取缓存的数据,键为一组key。 gets name hobby
value name 1 7
1234567
value hobby 0 25
tenis basketball football
end
set set [noreply]\r\n\r\n 向缓存中存储数据,不管key对应的值存在与否,都设置key对应的值。 set name 0 1800 7
shirdrn
stored
get name
value name 0 7
shirdrn
end
touch touch [noreply]\r\n 更新缓存中key对应的值的过期时间。 touch name 1800
delete delete [] [noreply]\r\n 给定键key,删除缓存中key对应的数据。 delete name 60
add add [noreply]\r\n\r\n 向缓存中存储数据,只有key对应的值不存在时,才会设置key对应的值。 add hobby 0 1800 10
basketball
stored
get hobbyvalue hobby 0 10
basketball
end
replace replace [noreply]\r\n\r\n 覆盖一个已经存在key及其对应的value,替换一定要保证替换后的值的长度原始长度相同,否则replace失败。 get name
value name 0 7
shirdrn
end
replace name 0 1800 7
youak47
stored
get name
value name 0 7
youak47
end
append append [noreply]\r\n\r\n 在一个已经存在的数据值(value)上追加,是在数据值的后面追加。 get hobby
value hobby 0 10
basketball
end
append hobby 0 1800 9
football
stored
get hobby
value hobby 0 19
basketball football
end
prepend prepend [noreply]\r\n\r\n 在一个已经存在的数据值(value)上追加,是在数据值的前面追加。 get hobby
value hobby 0 19
basketball football
end
prepend hobby 0 1800 6
tenis
stored
get hobby
value hobby 0 25
tenis basketball football
end
incr incr [noreply]\r\n 计数命令,可以在原来已经存在的数字上进行累加求和,计算并存储新的数值。 set active_users 0 1000000 7
1000000
stored
get active_users
value active_users 0 7
1000000
end
incr active_users 99
1000099
decr decr [noreply]\r\n 计数命令,可以在原来已经存在的数字上进行减法计算,计算并存储新的数值。 get active_users
value active_users 0 7
1000099
end
decr active_users 3456
996643
flush_all flush_all [] [noreply]\r\n 使缓存中的数据项失效,可选参数是在多少秒后失效。 flush_all 1800
version version\r\n 返回memcached服务器的版本信息。 version
quit quit\r\n 退出telnet终端。 quit
java客户端
可以使用java语言编写代码来访问memcached缓存。目前,可以使用的java客户端很多,这里简单介绍几个。
spymemcached客户端示例代码,如下所示:
package org.shirdrn.spymemcached;import net.spy.memcached.addrutil;import net.spy.memcached.binaryconnectionfactory;import net.spy.memcached.memcachedclient;import net.spy.memcached.internal.operationfuture;public class testspymemcached { public static void main(string[] args) throws exception { string address = 192.168.4.86:11211; memcachedclient client = new memcachedclient(new binaryconnectionfactory(), addrutil.getaddresses(address)); string key = magic_words; int exp = 3600; string o = hello; // set operationfuture setfuture = client.set(key, exp, o); if(setfuture.get()) { // get system.out.println(client.get(key)); // append client.append(key, the world!); system.out.println(client.get(key)); // prepend client.prepend(key, stone, ); system.out.println(client.get(key)); // replace o = this is a test for spymemcached.; operationfuture replacefuture = client.replace(key, exp, o); if(replacefuture.get()) { system.out.println(client.get(key)); // delete client.delete(key); system.out.println(client.get(key)); } } client.shutdown(); }}
更多用法,可以参考后面的链接。
xmemcached客户端示例代码,如下所示:
package org.shirdrn.xmemcached;import java.io.file;import java.io.ioexception;import java.io.serializable;import java.net.inetsocketaddress;import java.util.arrays;import java.util.list;import java.util.map;import java.util.concurrent.executorservice;import java.util.concurrent.executors;import java.util.concurrent.timeoutexception;import java.util.concurrent.atomic.atomiclong;import net.rubyeye.xmemcached.casoperation;import net.rubyeye.xmemcached.getsresponse;import net.rubyeye.xmemcached.memcachedclient;import net.rubyeye.xmemcached.xmemcachedclientbuilder;import net.rubyeye.xmemcached.command.binarycommandfactory;import net.rubyeye.xmemcached.exception.memcachedexception;import net.rubyeye.xmemcached.utils.addrutil;public class usingxmemcachedclient { public static void main(string[] args) throws ioexception { string servers = 192.168.4.86:11211; // build and create a client xmemcachedclientbuilder builder = new xmemcachedclientbuilder( addrutil.getaddresses(servers)); builder.setcommandfactory(new binarycommandfactory()); final memcachedclient client = builder.build(); // examples using client to operate final string key = ghost; try { // add client.add(key, 0, ghost wind blows!); system.out.println(add & get: + client.get(key)); // append client.append(key, it's a lie.); system.out.println(append & get: + client.get(key)); // prepend client.prepend(key, who's said?! ); system.out.println(prepend & get: + client.get(key)); // replace client.replace(key, 0, everything is nothing!); system.out.println(replace & get: + client.get(key)); // delete client.delete(key); system.out.println(delete & get: + client.get(key)); // gets list keys = arrays.aslist(new string[] { key1, key2, key3 }); for(string k : keys) { client.set(k, 3600, v: + system.nanotime()); } map> values = client.gets(keys); for(map.entry> entry : values.entryset()) { system.out.println(key= + entry.getkey() + , value= + entry.getvalue().getvalue()); } // cas final atomiclong seq = new atomiclong(system.nanotime()); executorservice pool = executors.newcachedthreadpool(); for(int i=0; io: + o); try { client.set(key, 0, o); thread.sleep(100); } catch (timeoutexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (interruptedexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (memcachedexception e) { // todo auto-generated catch block e.printstacktrace(); } } } }); } thread.sleep(3000); for(int i=0; i() { @override public int getmaxtries() { return 3; } @override public cacheresult getnewvalue(long arg0, cacheresult result) { cacheresult old = result; cacheresult nu = new cacheresult(); nu.file = old.file; nu.lastmodified = seq.incrementandget(); system.out.println(cas: old= + old + , new= + nu); return result; } }); } pool.shutdown(); // flush_all client.flushall(); // stats list addresses = addrutil.getaddresses(servers); for(inetsocketaddress addr : addresses) { map stats = client.stats(addr); system.out.println(stats); } } catch (timeoutexception e) { e.printstacktrace(); } catch (interruptedexception e) { e.printstacktrace(); } catch (memcachedexception e) { e.printstacktrace(); } synchronized(client) { try { client.wait(); } catch (interruptedexception e) { e.printstacktrace(); } } } static class cacheresult implements serializable { private static final long serialversionuid = 3349686173080590047l; private file file; private long lastmodified; @override public string tostring() { return file=[ + file + , lastmodified= + lastmodified + ]; } }}
node.js客户端
memcached客户端代码的逻辑都非常类似,这里对node.js简单举例说明,代码如下所示:
#!/usr/bin/env nodevar memcachedclient = require('memcached');// configure memcached clientvar servers = ['192.168.4.86:11211'];var client = new memcachedclient(servers);// access memcached serversvar key = 'ghost';// setvar value = 'ghost wind blows!';client.set(key, 0, value, function(err) { var data = 'key=' + key + ', value=' + value; if(err) { console.error('fail to set: ' + data); } else { console.log('added: ' + data); }});// getvar valuegot = client.get(key, function(err, data) { var datagot = 'key=' + key + ', valuegot=' + data; if(err) { console.error('fail to get: ' + datagot); } else { console.log('got: ' + datagot); }});
参考链接
http://www.memcached.orghttps://code.google.com/p/memcached/wiki/newstarthttp://www.memcached.org/files/memcached-1.4.20.tar.gzhttps://code.google.com/p/memcached/wiki/clientshttps://github.com/downloads/libevent/https://github.com/downloads/libevent/libevent/libevent-1.4.14b-stable.tar.gzhttps://code.google.com/p/spymemcached/https://code.google.com/p/xmemcached/https://github.com/killme2008/xmemcachedhttps://code.google.com/p/memcached/wiki/newcommandshttp://www.2cto.com/os/201303/193264.htmlhttp://tech.idv2.com/tag/memcached/http://programcreek.com/java-api-examples/index.php?api=net.spy.memcached.memcachedclienthttp://lzone.de/articles/memcached.htmhttp://blog.elijaa.org/?post/2010/05/21/memcached-telnet-command-summaryhttps://github.com/3rd-eden/node-memcachedhttps://www.npmjs.org/package/memcached 原文地址:memcached服务器安装、配置、使用详解, 感谢原作者分享。
其它类似信息

推荐信息