Memcached的使用
Memcached的使用
一、安装Memcached及Memcached配置和状态查询(此处将其作为系统服务安装)
要想使用Memcached做缓存首先需要安装Memcached服务,安装方法如下:
1.下载Memcached:http://code.jellycan.com/memcached/现在的最新版本是1.2.6.注意下载正确的版本,windows服务的话下载win32binary。
2.解压之后放在硬盘的目录下,如:D:\memcached.然后在运行中输入cmd进入命令行,进入到Memcached.exe所在的目录,例如:D:\memcached,然后输入:Memcached–dinstall,即可完成安装。
Memcached还有其他的一些常用的命令如下:
-p监听的端口
-l连接的IP地址,默认是本机
-dstart启动memcached服务
-drestart重起memcached服务
-dstop|shutdown关闭正在运行的memcached服务
-dinstall安装memcached服务
-duninstall卸载memcached服务
-u以的身份运行(仅在以root运行的时候有效)
-m最大内存使用,单位MB。默认64MB
-M内存耗尽时返回错误,而不是删除项
-c最大同时连接数,默认是1024
-f块大小增长因子,默认是1.25
-n最小分配空间,key+value+flags默认是48
-h显示帮助
按照上面的安装步骤安装之后,使用memcached–m200来调整最大内存占用之后会发现没有起作用,总是默认的64MB的内存,在网上搜了一下,原因是注册表中并没有写入信息,可以这样来修改。
1.memcached–dshutdown首先关闭memcached服务。
2.进入注册表,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcachedServer,在其中有一个ImagePath项,值为"d:\memcached\memcached.exe"-drunservice,在后面加上-l127.0.0.1-m3000-c2048。
3.memcached–dstart启动memcached服务,这样就将memcached的最大内存修改为了3000MB。
对Memcached缓存服务的状态查询,可以先telnet连接上服务:telnet127.0.0.111211,然后使用stats命令查看缓存服务的状态,会返回如下的数据:
time:1255537291服务器当前的unix时间戳
total_items:54从服务器启动以后存储的items总数量
connection_structures:19服务器分配的连接构造数
version:1.2.6memcache版本
limit_maxbytes:67108864分配给memcache的内存大小(字节)
cmd_get:1645get命令(获取)总请求次数
evictions:0为获取空闲内存而删除的items数(分配给memcache的空间用满后需
要删除旧的items来得到空间分配给新的items)
total_connections:19从服务器启动以后曾经打开过的连接数
bytes:248723当前服务器存储items占用的字节数
threads:1当前线程数
get_misses:82总未命中次数
pointer_size:32当前操作系统的指针大小(32位系统一般是32bit)
bytes_read:490982总读取字节数(请求字节数)
uptime:161服务器已经运行的秒数
curr_connections:18当前打开着的连接数
pid:2816memcache服务器的进程ID
bytes_written:16517259总发送字节数(结果字节数)
get_hits:1563总命中次数
cmd_set:54set命令(保存)总请求次数
curr_items:28服务器当前存储的items数量
二、客户端使用
下载memcachedjavaclient:[url]https://github.com/gwhalin/Memcached-Java-Client[/url]1解压后将java_memcached-release_2.5.3.jarjar包添加到工程的classpath中
2 利用memcached java client 一个简单的应用/**
*Copyright(c)2008GregWhalin
*Allrightsreserved.
*
*Thislibraryisfreesoftware;youcanredistributeitand/or
*modifyitunderthetermsoftheBSDlicense
*
*Thislibraryisdistributedinthehopethatitwillbe
*useful,butWITHOUTANYWARRANTY;withouteventheimplied
*warrantyofMERCHANTABILITYorFITNESSFORAPARTICULAR
*PURPOSE.
*
*YoushouldhavereceivedacopyoftheBSDLicensealongwiththis
*library.
*
*@authorGregWhalin<[email protected]>
*/
packagecom.danga.MemCached.test;
importjava.util.Hashtable;
importcom.danga.MemCached.MemCachedClient;
importcom.danga.MemCached.SockIOPool;
publicclassMemcachedTest{
//storeresultsfromthreads
privatestaticHashtable<Integer,StringBuilder>threadInfo=
newHashtable<Integer,StringBuilder>();
/**
*ThisrunsthroughsomesimpletestsoftheMemcacheClient.
*
*Commandlineargs:
*args[0]=numberofthreadstospawn生产的线程的数目
*args[1]=numberofrunsperthread每个线程操作次数
*args[2]=sizeofobjecttostore
*
*@paramargsthecommandlinearguments
*/
publicstaticvoidmain(String[]args){
//String[]serverlist={"hengtiandesk144:11211","hengtiandesk144:11212"};
String[]serverlist={"localhost:11211"};
//initializethepoolformemcacheservers
SockIOPoolpool=SockIOPool.getInstance();
pool.setServers(serverlist);
pool.setInitConn(5);
pool.setMinConn(5);
pool.setMaxConn(50);
//Setthesleeptimebetweenrunsofthepoolmaintenancethread.
pool.setMaintSleep(30);
//SetstheNaglealgflagforthepool.
pool.setNagle(false);
pool.initialize();
/*intthreads=Integer.parseInt(args[0]);
intruns=Integer.parseInt(args[1]);
intsize=1024*Integer.parseInt(args[2]);//howmanykilobytes
*/
intthreads=Integer.parseInt("20");
intruns=Integer.parseInt("30");
intsize=1024*Integer.parseInt("10");//howmanykilobytes
//getobjecttostore
int[]obj=newint[size];
for(inti=0;i<size;i++){
obj[i]=i;
}
String[]keys=newString[size];
for(inti=0;i<size;i++){
keys[i]="test_key"+i;
}
for(inti=0;i<threads;i++){//模仿连接服务器数目
benchb=newbench(runs,i,obj,keys);
b.start();
}
inti=0;
while(i<threads){
if(threadInfo.containsKey(newInteger(i))){
System.out.println(threadInfo.get(newInteger(i)));
i++;
}
else{
try{
Thread.sleep(1000);
}
catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
pool.shutDown();
System.exit(1);
}
/**
*Testcodeperthread.
*/
privatestaticclassbenchextendsThread{
privateintruns;
privateintthreadNum;
privateint[]object;
privateString[]keys;
privateintsize;
publicbench(intruns,intthreadNum,int[]object,String[]keys){
this.runs=runs;
this.threadNum=threadNum;
this.object=object;
this.keys=keys;
this.size=object.length;
}
@SuppressWarnings("deprecation")
publicvoidrun(){
//单线程,多线程不安全
StringBuilderresult=newStringBuilder();
//getclientinstance
MemCachedClientmc=newMemCachedClient();
mc.setCompressEnable(false);
mc.setCompressThreshold(0);
//timedeletes
longstart=System.currentTimeMillis();
for(inti=0;i<runs;i++){
mc.delete(keys[i]);
}
longelapse=System.currentTimeMillis()-start;
floatavg=(float)elapse/runs;
result.append("\nthread"+threadNum+":runs:"+runs+"deletesofobj"+(size/1024)+"KB--avgtimeperreq"+avg+"ms(total:"+elapse+"ms)");
//timestores
start=System.currentTimeMillis();
for(inti=0;i<runs;i++){
//System.out.println(keys[i]+object[i]);
mc.set(keys[i],object[i]);
}
elapse=System.currentTimeMillis()-start;
avg=(float)elapse/runs;
result.append("\nthread"+threadNum+":runs:"+runs+"storesofobj"+(size/1024)+"KB--avgtimeperreq"+avg+"ms(total:"+elapse+"ms)");
//timegets
start=System.currentTimeMillis();
for(inti=0;i<runs;i++){
mc.get(keys[i]);
}
elapse=System.currentTimeMillis()-start;
avg=(float)elapse/runs;
result.append("\nthread"+threadNum+":runs:"+runs+"getsofobj"+(size/1024)+"KB--avgtimeperreq"+avg+"ms(total:"+elapse+"ms)");
threadInfo.put(newInteger(threadNum),result);
}
}
}- java_memcached-release_2.5.3.jar
- memcached-1.2.6-win32-bin.zip
- java_memcached-release_2.5.2.zip
- memcached-1.2.6-win32-src.zip
- java_memcached-release_2.5.2.jar