Memcached 客户端程序三种API的比较

来源:互联网 发布:哈尔滨程序员工资 编辑:程序博客网 时间:2024/06/06 17:02
  1. Memcached 客户端程序  
  2.    
  3. Memcached的java客户端已经存在三种了:  
  4.    
  5. ?  官方提供的基于传统阻塞io由Greg Whalin维护的客户端  
  6.    
  7. ?  Dustin Sallings实现的基于java nio的Spymemcached  
  8.    
  9. ?  XMemcached  
  10.    
  11.   
  12. 1. 三种API比较  
  13.  1)      memcached client for java  
  14.    
  15. 较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。   
  16.   
  17.   
  18. 2)      spymemcached  
  19.    
  20. A simple, asynchronous, single-threaded memcached client written in java. 支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常 报timeOut等相关异常。   
  21.   
  22.   
  23. 3)      xmemcached  
  24.    
  25. XMemcached同样是基于java nio的客户端,java nio相比于传统阻塞io模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接 池,而nio仅需要一个连接即可(当然,nio也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。因此 XMemcached与Spymemcached在性能都非常优秀,在某些方面(存储的数据比较小的情况下)Xmemcached比 Spymemcached的表现更为优秀,具体可以看这个Java Memcached Clients Benchmark。  
  26.    
  27.   
  28. 2.  建议  
  29.    
  30. 由于memcached client for java发布了新版本,性能上有所提高,并且运行稳定,所以建议使用memcached client for java。  
  31.    
  32. XMemcached也使用得比较广泛,而且有较详细的中文API文档,具有如下特点:高性 能、支持完整的协议、支持客户端分布、允许设置节点权重、动态增删节点、支持JMX、与Spring框架和Hibernate-memcached的集 成、客户端连接池、可扩展性好等。  
  33.    
  34. 下面给出这三种客户端的示例程序。  
  35.    
  36.   
  37. 3.  示例程序   
  38. 1)      memcached client for java  
  39.    
  40. 从前面介绍的Java环境的Memcached客户端程序项目网址里,下载最新版的客户端程 序包:java_memcached-release_2.5.1.zip,解压后,文件夹里找到java_memcached- release_2.5.1.jar,这个就是客户端的JAR包。将此JAR包添加到项目的构建路径里,则项目中,就可以使用Memcached了。  
  41.    
  42. 示例代码如下:  
  43.    
  44. package temp;  
  45.    
  46.    
  47.    
  48. import com.danga.MemCached.*;  
  49.    
  50. import org.apache.log4j.*;  
  51.    
  52.    
  53.    
  54. public class CacheTest {  
  55.    
  56.     public static void main(String[] args) {  
  57.    
  58.        /**  
  59.    
  60.         * 初始化SockIOPool,管理memcached的连接池  
  61.    
  62.         * */  
  63.    
  64.        String[] servers = { "10.11.15.222:10000" };  
  65.    
  66.        SockIOPool pool = SockIOPool.getInstance();  
  67.    
  68.        pool.setServers(servers);  
  69.    
  70.        pool.setFailover(true);  
  71.    
  72.        pool.setInitConn(10);  
  73.    
  74.        pool.setMinConn(5);  
  75.    
  76.        pool.setMaxConn(250);  
  77.    
  78.        pool.setMaintSleep(30);  
  79.    
  80.        pool.setNagle(false);  
  81.    
  82.        pool.setSocketTO(3000);  
  83.    
  84.        pool.setAliveCheck(true);  
  85.    
  86.        pool.initialize();  
  87.    
  88.    
  89.    
  90.        /**  
  91.    
  92.         * 建立MemcachedClient实例  
  93.    
  94.         * */  
  95.    
  96.        MemCachedClient memCachedClient = new MemCachedClient();  
  97.    
  98.        for (int i = 0; i < 1000; i++) {  
  99.    
  100.            /**  
  101.    
  102.             * 将对象加入到memcached缓存  
  103.    
  104.             * */  
  105.    
  106.            boolean success = memCachedClient.set("" + i, "Hello!");  
  107.    
  108.            /**  
  109.    
  110.             * 从memcached缓存中按key值取对象  
  111.    
  112.             * */  
  113.    
  114.            String result = (String) memCachedClient.get("" + i);  
  115.    
  116.            System.out.println(String.format("set( %d ): %s", i, success));  
  117.    
  118.            System.out.println(String.format("get( %d ): %s", i, result));  
  119.    
  120.        }  
  121.    
  122.     }  
  123.    
  124. }  
  125.    
  126.   
  127. 2)      spymemcached  
  128.    
  129. spymemcached当前版本是2.5版本,官方网址是:http://code.google.com/p/spymemcached/。可以从地址:http://spymemcached.googlecode.com/files/memcached-2.5.jar 下载最新版本来使用。  
  130.    
  131. 示例代码如下:  
  132.    
  133. package temp;  
  134.    
  135.    
  136.    
  137. import java.net.InetSocketAddress;  
  138.    
  139. import java.util.concurrent.Future;  
  140.    
  141.    
  142.    
  143. import net.spy.memcached.MemcachedClient;  
  144.    
  145.    
  146.    
  147. public class TestSpyMemcache {  
  148.    
  149.     public static void main(String[] args) {  
  150.    
  151.        // 保存对象  
  152.    
  153.        try {  
  154.    
  155.            /* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */  
  156.    
  157.            MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.11.15.222", 10000));  
  158.    
  159.            Future<Boolean> b = null;  
  160.    
  161.            /* 将key值,过期时间(秒)和要缓存的对象set到memcached中 */  
  162.    
  163.            b = mc.set("neea:testDaF:ksIdno", 900, "someObject");  
  164.    
  165.            if (b.get().booleanValue() == true) {  
  166.    
  167.               mc.shutdown();  
  168.    
  169.            }  
  170.    
  171.        } catch (Exception ex) {  
  172.    
  173.            ex.printStackTrace();  
  174.    
  175.        }  
  176.    
  177.        // 取得对象  
  178.    
  179.         try {  
  180.    
  181.            /* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */  
  182.    
  183.            MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.11.15.222", 10000));  
  184.    
  185.            /* 按照key值从memcached中查找缓存,不存在则返回null */  
  186.    
  187.            Object b = mc.get("neea:testDaF:ksIdno");  
  188.    
  189.            System.out.println(b.toString());  
  190.    
  191.            mc.shutdown();  
  192.    
  193.        } catch (Exception ex) {  
  194.    
  195.            ex.printStackTrace();  
  196.    
  197.        }  
  198.    
  199.     }  
  200.    
  201. }  
  202.    
  203.   
  204. 3)      xmemcached  
  205.    
  206. Xmemcached的官方网址是:http://code.google.com/p/xmemcached/,可以从其官网上下载最新版本的1.2.4 来使用。地址是:http://xmemcached.googlecode.com/files/xmemcached-1.2.4-src.tar.gz 。  
  207.    
  208. 示例代码如下:  
  209.    
  210. package temp;  
  211.    
  212.    
  213.    
  214. import java.io.IOException;  
  215.    
  216. import java.util.concurrent.TimeoutException;  
  217.    
  218.    
  219.    
  220. import net.rubyeye.xmemcached.utils.AddrUtil;  
  221.    
  222. import net.rubyeye.xmemcached.MemcachedClient;  
  223.    
  224. import net.rubyeye.xmemcached.MemcachedClientBuilder;  
  225.    
  226. import net.rubyeye.xmemcached.XMemcachedClientBuilder;  
  227.    
  228. import net.rubyeye.xmemcached.exception.MemcachedException;  
  229.    
  230.    
  231.    
  232. public class TestXMemcache {  
  233.    
  234.     public static void main(String[] args) {  
  235.    
  236.        MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil  
  237.    
  238.               .getAddresses("10.11.15.222:10000"));  
  239.    
  240.        MemcachedClient memcachedClient;  
  241.    
  242.        try {  
  243.    
  244.            memcachedClient = builder.build();  
  245.    
  246.    
  247.    
  248.            memcachedClient.set("hello", 0, "Hello,xmemcached");  
  249.    
  250.            String value = memcachedClient.get("hello");  
  251.    
  252.            System.out.println("hello=" + value);  
  253.    
  254.            memcachedClient.delete("hello");  
  255.    
  256.            value = memcachedClient.get("hello");  
  257.    
  258.            System.out.println("hello=" + value);  
  259.    
  260.            // close memcached client  
  261.    
  262.            memcachedClient.shutdown();  
  263.    
  264.        } catch (MemcachedException e) {  
  265.    
  266.            System.err.println("MemcachedClient operation fail");  
  267.    
  268.            e.printStackTrace();  
  269.    
  270.        } catch (TimeoutException e) {  
  271.    
  272.            System.err.println("MemcachedClient operation timeout");  
  273.    
  274.            e.printStackTrace();  
  275.    
  276.        } catch (InterruptedException e) {  
  277.    
  278.            // ignore  
  279.    
  280.        }catch (IOException e) {  
  281.    
  282.            System.err.println("Shutdown MemcachedClient fail");  
  283.    
  284.            e.printStackTrace();  
  285.    
  286.        }  
  287.    
  288.     }  
  289.    
  290. }  
0 0