Memcached实际应用经验

一、   概念

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"


你可能感兴趣的:(Memcached实际应用经验)