三种memcached的JAVA客户端比较

- 日理万妓 2022-06-10 08:47 269阅读 0赞

Memcached客户端程序

Memcached的Java客户端已经存在三种了:

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

* DustinSallings实现的基于Java nio的Spymemcached

* 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版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常。

3) xmemcached

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

  1. 建议

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

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

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

  1. 示例程序
    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) {

  1. /\*\*
  2. \* 初始化SockIOPool,管理memcached的连接池
  3. \* \*/
  4. String\[\] servers = \{ "10.11.15.222:10000" \};
  5. SockIOPool pool = SockIOPool.getInstance();
  6. pool.setServers(servers);
  7. pool.setFailover(true);
  8. pool.setInitConn(10);
  9. pool.setMinConn(5);
  10. pool.setMaxConn(250);
  11. pool.setMaintSleep(30);
  12. pool.setNagle(false);
  13. pool.setSocketTO(3000);
  14. pool.setAliveCheck(true);
  15. pool.initialize();
  16. /\*\*
  17. \* 建立MemcachedClient实例
  18. \* \*/
  19. MemCachedClient memCachedClient = new MemCachedClient();
  20. for (int i = 0; i < 1000; i++) \{
  21. /\*\*
  22. \* 将对象加入到memcached缓存
  23. \* \*/
  24. boolean success = memCachedClient.set("" + i, "Hello!");
  25. /\*\*
  26. \* memcached缓存中按key值取对象
  27. \* \*/
  28. String result = (String) memCachedClient.get("" + i);
  29. System.out.println(String.format("set( %d ): %s", i, success));
  30. System.out.println(String.format("get( %d ): %s", i, result));
  31. \}

}

}

2) spymemcached

spymemcached当前版本是2.5版本,官方网址是:http://code.google.com/p/spymemcached/。可以从地址:[http://spymemcached.googlecode.com/files/memcached-2.5.jar][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) {

  1. // 保存对象
  2. try \{
  3. /\* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 \*/
  4. MemcachedClient mc = new MemcachedClient(newInetSocketAddress("10.11.15.222", 10000));
  5. Future<Boolean> b = null;
  6. /\* 将key值,过期时间(秒)和要缓存的对象set到memcached中 \*/
  7. b = mc.set("neea:testDaF:ksIdno", 900, "someObject");
  8. if (b.get().booleanValue() == true) \{
  9. mc.shutdown();
  10. \}
  11. \} catch (Exception ex) \{
  12. ex.printStackTrace();
  13. \}
  14. // 取得对象
  15. try \{
  16. /\* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 \*/
  17. MemcachedClient mc = new MemcachedClient(newInetSocketAddress("10.11.15.222", 10000));
  18. /\* 按照key值从memcached中查找缓存,不存在则返回null \*/
  19. Object b = mc.get("neea:testDaF:ksIdno");
  20. System.out.println(b.toString());
  21. mc.shutdown();
  22. \} catch (Exception ex) \{
  23. ex.printStackTrace();
  24. \}

}

}

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) {

  1. MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil
  2. .getAddresses("10.11.15.222:10000"));
  3. MemcachedClient memcachedClient;
  4. try \{
  5. memcachedClient = builder.build();
  6. memcachedClient.set("hello", 0, "Hello,xmemcached");
  7. String value = memcachedClient.get("hello");
  8. System.out.println("hello=" + value);
  9. memcachedClient.delete("hello");
  10. value = memcachedClient.get("hello");
  11. System.out.println("hello=" + value);
  12. // close memcached client
  13. memcachedClient.shutdown();
  14. \} catch (MemcachedException e) \{
  15. System.err.println("MemcachedClient operation fail");
  16. e.printStackTrace();
  17. \} catch (TimeoutException e) \{
  18. System.err.println("MemcachedClient operation timeout");
  19. e.printStackTrace();
  20. \} catch (InterruptedException e) \{
  21. // ignore
  22. \}catch (IOException e) \{
  23. System.err.println("Shutdown MemcachedClient fail");
  24. e.printStackTrace();
  25. \}

}

}

发表评论

表情:
评论列表 (有 0 条评论,269人围观)

还没有评论,来说两句吧...

相关阅读