三种memcached的JAVA客户端比较

 Memcached客户端程序

Memcachedjava客户端已经存在三种了:

* 官方提供的基于传统阻塞ioGreg Whalin维护的客户端

* DustinSallings实现的基于java nioSpymemcached

* XMemcached


1. 三种API比较 
1)      memcached client forjava

较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。


2)      spymemcached

A simple,asynchronous, single-threaded memcached client written in java. 支持异步,单线程的memcached客户端,用到了java1.5版本的concurrentnio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常。


3)      xmemcached

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


2.  建议

由于memcached client for java发布了新版本,性能上有所提高,并且运行稳定,所以建议使用memcached clientfor java

XMemcached也使用得比较广泛,而且有较详细的中文API文档,具有如下特点:高性能、支持完整的协议、支持客户端分布、允许设置节点权重、动态增删节点、支持JMX、与Spring框架和Hibernate-memcached的集成、客户端连接池、可扩展性好等。

下面给出这三种客户端的示例程序。


3.  示例程序
1)      memcached client forjava

从前面介绍的Java环境的Memcached客户端程序项目网址里,下载最新版的客户端程序包:java_memcached-release_2.5.1.zip,解压后,文件夹里找到java_memcached-release_2.5.1.jar,这个就是客户端的JAR包。将此JAR包添加到项目的构建路径里,则项目中,就可以使用Memcached了。

示例代码如下:

package temp;

 

importcom.danga.MemCached.*;

importorg.apache.log4j.*;

 

public classCacheTest {

   public static void main(String[] args) {

      /**

       * 初始化SockIOPool,管理memcached的连接池

       * */

      String[] servers = { "10.11.15.222:10000" };

      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 < 1000; 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)      spymemcached

spymemcached当前版本是2.5版本,官方网址是:http://code.google.com/p/spymemcached/。可以从地址:http://spymemcached.googlecode.com/files/memcached-2.5.jar下载最新版本来使用。

示例代码如下:

package temp;

 

importjava.net.InetSocketAddress;

importjava.util.concurrent.Future;

 

importnet.spy.memcached.MemcachedClient;

 

public classTestSpyMemcache {

   public static void main(String[] args) {

      // 保存对象

      try {

          /* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */

          MemcachedClient mc = new MemcachedClient(newInetSocketAddress("10.11.15.222", 10000));

          Future<Boolean> b = null;

          /* key值,过期时间()和要缓存的对象setmemcached */

          b = mc.set("neea:testDaF:ksIdno", 900, "someObject");

          if (b.get().booleanValue() == true) {

             mc.shutdown();

          }

      } catch (Exception ex) {

          ex.printStackTrace();

      }

      // 取得对象

       try {

          /* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */

          MemcachedClient mc = new MemcachedClient(newInetSocketAddress("10.11.15.222", 10000));

          /* 按照key值从memcached中查找缓存,不存在则返回null */

          Object b = mc.get("neea:testDaF:ksIdno");

          System.out.println(b.toString());

          mc.shutdown();

      } catch (Exception ex) {

          ex.printStackTrace();

      }

   }

}


3)      xmemcached

Xmemcached的官方网址是:http://code.google.com/p/xmemcached/,可以从其官网上下载最新版本的1.2.4来使用。地址是:http://xmemcached.googlecode.com/files/xmemcached-1.2.4-src.tar.gz

示例代码如下:

package temp;

 

importjava.io.IOException;

importjava.util.concurrent.TimeoutException;

 

importnet.rubyeye.xmemcached.utils.AddrUtil;

importnet.rubyeye.xmemcached.MemcachedClient;

importnet.rubyeye.xmemcached.MemcachedClientBuilder;

importnet.rubyeye.xmemcached.XMemcachedClientBuilder;

importnet.rubyeye.xmemcached.exception.MemcachedException;

 

public classTestXMemcache {

   public static void main(String[] args) {

      MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil

             .getAddresses("10.11.15.222:10000"));

      MemcachedClient memcachedClient;

      try {

          memcachedClient = builder.build();

      

          memcachedClient.set("hello", 0, "Hello,xmemcached");

          String value = memcachedClient.get("hello");

          System.out.println("hello=" + value);

          memcachedClient.delete("hello");

          value = memcachedClient.get("hello");

          System.out.println("hello=" + value);

          // close memcached client

          memcachedClient.shutdown();

      } catch (MemcachedException e) {

          System.err.println("MemcachedClient operation fail");

          e.printStackTrace();

      } catch (TimeoutException e) {

          System.err.println("MemcachedClient operation timeout");

          e.printStackTrace();

      } catch (InterruptedException e) {

          // ignore

      }catch (IOException e) {

          System.err.println("Shutdown MemcachedClient fail");

          e.printStackTrace();

      }

   }

}

 


用好Cache,优化应用 服务集成平台5.6的性能测试进入尾声,这期的优化也算告一段落。这次主要的优化工作还是在三个方面:应用服务器(Apache,JBoss)配置,业务流程,Cache Client(http://code.google.com/p/memcache-client-forjava/ )。这里把过去和这次优化对于Cache的使用作一个经验分享,希望大家能够用好Cache,提速你的应用。 这里还是通过一些点滴的启示来介绍优化的一些心得,很多时候还是要根据具体情况来判断如何去具体实施,因此这里所说的仅仅是在一些场景下适用,并非放之四海皆准的教条。同时也希望看此文的各位同学,如果有更好的思路可以给我反馈,技术在交流中才会有发展。 积少成多,集腋成裘 性能提不上去,多半是在一些容易成为瓶颈的“暗点”(IO,带宽,连接数,资源竞争等等)。Memcached Cache现在已经被大家广泛使用,但是千万不要认为对Cache的操作是低损耗的,要知道这类集中式Cache对Socket连接数(会牵涉到linux操作系统文件句柄可用数),带宽,网络IO都是有要求的,有要求就意味着会有损失,因此积少成多,集腋成裘。服务集成平台是一个高速的服务路由器,其大部分的业务数据,访问控制策略,安全策略以及对应的一些控制阀值被缓存在Cache服务端,因此对于Cache的依赖性很强。每一次对于客户端的性能提升,总会给服务集成平台性能带来不小的影响,但是每一次优化速度后,客户端可以优化的空间越来越小,这时候需要一些策略来配合,提升应用整体性能。当前主要采用了以下几点策略:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值