一、 概念
Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。
二、 适用场合
1. 分布式应用。由于memcached本身基于分布式的系统,所以尤其适合大型的分布式系统。
2. 数据库前段缓存。数据库常常是网站系统的瓶颈。数据库的大并发量访问,常常造成网站内存溢出。当然我们也可以使用Hibernate的缓存机制。但memcached是基于分布式的,并可独立于网站应用本身,所以更适合大型网站进行应用的拆分。
3. 服务器间数据共享。举例来讲,我们将网站的登录系统、查询系统拆分为两个应用,放在不同的服务器上,并进行集群,那这个时候用户登录后,登录信息如何从登录系统服务器同步到查询系统服务器呢?这时候,我们便可以使用memcached,登录系统将登录信息缓存起来,查询系统便可以获得登录信息,就像获取本地信息一样。
三、 不适用场合
那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源
四、 安装
这里介绍windows环境的安装。
1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached
2. 在cmd下输入 'c:\memcached\memcached.exe -d install' 安装
3. 再输入:'c:\memcached\memcached.exe -d start' 启动。
以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。
五、 例子代码
package PerformTuning;
import java.io.Serializable;
public class PersonBean implements Serializable{
private static final long serialVersionUID = 5344571864700659321L;
public String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
package PerformTuning;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
public class callMemCached {
public static MemCachedClient client;
public static void cacheString(){
//String [] s =pool.getServers();
//将数据放入缓存
client.set("test2","test2");
//将数据放入缓存,并设置失效时间
Date date=new Date(2000000);
client.set("test1","test1", date);
//删除缓存数据
//client.delete("test1");
//获取缓存数据
String str =(String)client.get("test1");
System.out.println(str);
}
public static void cacheBean(){
PersonBean person = new PersonBean();
person.setName("michael");
client.add("name1", person);
PersonBean person_unbox = new PersonBean();
person_unbox=(PersonBean)client.get("name1");
System.out.println(person_unbox.getName());
}
public static void cacheList(){
PersonBean person = new PersonBean();
ArrayList<PersonBean> list = new ArrayList<PersonBean>();
ArrayList<PersonBean> list_unbox = new ArrayList<PersonBean>();
System.out.println("开始建List"+new Date());
for(int i=0;i<1000000;i++){
person = new PersonBean();
person.setName("test"+i);
list.add(person);
}
System.out.println("有多少个在建好的list里面呢? "+list.size());
client.add("list_test", list);
System.out.println("建List结束"+new Date());
System.out.println("开始解压缩List"+new Date());
list_unbox = (ArrayList)client.get("list_test");
System.out.println("总共有多少个在list里面呢? "+list_unbox.size());
for(int i=0;i<list_unbox.size();i++){
PersonBean person_unbox = (PersonBean)list_unbox.get(i);
//System.out.println(person_unbox.getName());
}
System.out.println("结束List的解压缩"+new Date());
}
public static void main(String[] args){
client=new MemCachedClient();
String [] addr ={"172.7.27.225:11211"};
Integer [] weights = {3};
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(addr);
pool.setWeights(weights);
pool.setInitConn(5);
pool.setMinConn(5);
pool.setMaxConn(200);
pool.setMaxIdle(1000*30*30);
pool.setMaintSleep(30);
pool.setNagle(false);
pool.setSocketTO(30);
pool.setSocketConnectTO(0);
pool.initialize();
//callMemCached.cacheString();
//callMemCached.cacheBean();
callMemCached.cacheList();
}
}
六、memcached查看和清理,
数据存储(假设key为test,value为12345)数据存储(假设key为test,value为12345)printf "set test 0 0 5\r\n12345\r\n" | nc 127.0.0.1 200001STORED
1.一种
telnet localhost 200001 #登陆
stats #查看状态
flush_all #清理
quit #退出
2.又学到一个:
echo 'flush_all' | nc localhost 200001
3.
1、数据存储(假设key为test,value为12345)
printf "set test 0 0 5\r\n12345\r\n" | nc 127.0.0.1 200001
STORED
2、数据取回(假设key为test)
printf "get test\r\n" | nc 127.0.0.1 200001
VALUE test 0 5
12345
END
3、数值增加1(假设key为test,并且value为正整数)
printf "incr test 1\r\n" | nc 127.0.0.1 200001
12346
4、数值减少3(假设key为test,并且value为正整数)
printf "decr test 3\r\n" | nc 127.0.0.1 200001
12343
5、数据删除(假设key为test)
printf "delete test\r\n" | nc 127.0.0.1 11211
DELETED
6、查看Memcached状态
printf "stats\r\n" | nc 127.0.0.1 200001
STAT pid 3025
STAT uptime 4120500
STAT time 1228021767
STAT version 1.2.6
STAT pointer_size 32
STAT rusage_user 433.463103
STAT rusage_system 1224.515845
STAT curr_items 1132460
STAT total_items 8980260
STAT bytes 1895325386
STAT curr_connections 252
STAT total_connections 547850
STAT connection_structures 1189
STAT cmd_get 13619685
STAT cmd_set 8980260
STAT get_hits 6851607
STAT get_misses 6768078
STAT evictions 0
STAT bytes_read 160396238246
STAT bytes_written 260080686529
STAT limit_maxbytes 2147483648
STAT threads 1
END
7、模拟top命令,查看Memcached状态:
printf "stats\r\n" | nc 127.0.0.1 200001
或者
watch "echo stats | nc 127.0.0.1 200001"