首页 » IO和NIO » 正文

Memcache的三种Java客户端的对比和选择

Memcache作为一个著名的缓存项目支持多种语言和多种形式的客户端,作为一个Java开发人员,我们必须了解各种客户端的不同,这有利于我们在技术选型的时候充分的评估其优缺点,从而选择最佳的缓存产品以及缓存客户端,最终对技术选型进行合理的决策。

1.官方提供的基于传统阻塞io由Greg Whalin维护的客户端memcached client for java

网址:http://www.whalin.com/memcached
最新版本:java_memcached-release_2.0.1
特点: 较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定,使用阻塞IO,不支持CAS操作。
使用示例:

    import com.danga.MemCached.*;  
    import org.apache.log4j.*;  
    public class TestMemcached {  有        public static void main(S有ing[] args) {  
            /*初始化SockIOPool,管理memcached的连接池*/  
            String[] servers = { "192.168.1.20:12111" };  
            SockIOPool pool = SockIOPool.getInstance();  
            pool.setServers(servers);  
            pool.setFailover(true);  
            pool.setInitConn(10);  
            pool.setMinConn(5);  
            pool.setMaxConn(250);  
            pool.setMaintSleep(30);  
            pool.setNagle(false);  
            pool.setSocketTO(3000);  
            pool.setAliveCheck(true);  
            pool.initialize();  
            /*建立MemcachedClient实例*/  
            MemCachedClient memCachedClient = new MemCachedClient();  
            for (int i = 0; i < 10; i++) {  
                /*将对象加入到memcached缓存*/  
                boolean success = memCachedClient.set("" + i, "Hello!");  
                /*从memcached缓存中按key值取对象*/  
                String result = (String) memCachedClient.get("" + i);  
                System.out.println(String.format("set( %d ): %s", i, success));  
                System.out.println(String.format("get( %d ): %s", i, result));  
            }  
        }  
    }  

2.Dustin Sallings实现的基于java nio的Spymemcached

网址:http://code.google.com/p/spymemcached/
最新版本:memcached-2.1.jar
特点: A simple, asynchronous, single-threaded memcached client written in java. 用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常,支持CAS操作。
操作示例:

用spymemcached将对象存入缓存:

    import java.net.InetSocketAddress;  
    import java.util.concurrent.Future;  
      
    import net.spy.memcached.MemcachedClient;  
      
    public class MClient {  
          
        public static void main(String[] args){  
            try{  
                /*建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号*/  
                MemcachedClient mc = new MemcachedClient(new InetSocketAddress("192.168.1.20", 12111));  
                Future b = null;  
                /*将key值,过期时间(秒)和要缓存的对象set到memcached中*/  
                b = mc.set("neea:testDaF:ksIdno", 900, "someObject");  
                if(b.get().booleanValue()==true){  
                    mc.shutdown();  
                }  
            }  
            catch(Exception ex){  
                ex.printStackTrace();  
            }  
        }  
    }  

用spymemcached从缓存中取得对象:

    import java.net.InetSocketAddress;  
    import java.util.concurrent.Future;  
      
    import net.spy.memcached.MemcachedClient;  
      
    public class MClient {  
          
        public static void main(String[] args){  
            try{  
                /*建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号*/  
                MemcachedClient mc = new MemcachedClient(new InetSocketAddress("192.168.1.20", 12111));  
                /*按照key值从memcached中查找缓存,不存在则返回null */  
    Object b = mc.get("neea:testDaF:ksIdno ");  
                mc.shutdown();  
            }  
            catch(Exception ex){  
                ex.printStackTrace();  
            }  
        }  
    }  

3 XMemcached

XMemcached同样是基于Java NIO的客户端,Java NIO相比于传统阻塞IO模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接池,而NIO仅需要一个连接即可(当然,NIO也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。因此 XMemcached与Spymemcached在性能都非常优秀,在某些方面(存储的数据比较小的情况下)Xmemcached比 Spymemcached的表现更为优秀。

总结: Java Memcache Client for Java应用最广泛,也是当前最稳定的客户端, 在线上系统大量的使用此客户端。当然,SpyMemecache和XMemcache由于使用的是NIO的IO模型,性能更高,稳定性也在提高,在性能需求较高的情况下也是比较不错的选择。