其实现在来尝试Memcached的客户端估计会有点过气,因为现在大势基本都在Redis那边。

Memcached Client目前有3种:

  • Memcached Client for Java(已经停止更新)
  • SpyMemcached(已经停止更新)
  • XMemcached(一直更新,且支持客户端分片实现集群,基本现在是它的天下)
    • 高性能
    • 支持完整的Memcached文本协议,二进制协议。
    • 支持JMX,可以通过MBean调整性能参数、动态添加/移除Server、查看统计等。
    • 支持客户端统计
    • 支持Memcached节点的动态增减。
    • 支持Memcached分布:余数分布和一致性哈希分布。
    • 更多的性能调整选项。
    • XMemcached更容易与Spring集成。
    • 支持客户端分片实现集群。

三种API的比较

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

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

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

示例代码

Memcached Client for Java

官网:https://github.com/gwhalin/Memcached-Java-Client

这个已经停止跟新。放弃使用!

  1. import java.util.Date;
  2.  
  3. import com.danga.MemCached.*;
  4.  
  5. public class MemcacheManagerForGwhalin {
  6.  
  7. // 构建缓存客户端
  8. private static MemCachedClient cachedClient;
  9. // 单例模式实现客户端管理类
  10. private static MemcacheManagerForGwhalin INSTANCE = new MemcacheManagerForGwhalin();
  11.  
  12. private MemcacheManagerForGwhalin() {
  13. cachedClient = new MemCachedClient();
  14.  
  15. // 初始化SockIOPool,管理memcached的连接池
  16. SockIOPool pool = SockIOPool.getInstance();
  17.  
  18. // 设置缓存服务器列表,当使用分布式缓存的时,可以指定多个缓存服务器。(这里应该设置为多个不同的服务器)
  19. String[] servers = { "192.168.163.10:11211", "192.168.163.11:11211"
  20. // 也可以使用域名 "server3.mydomain.com:1624"
  21. };
  22.  
  23. pool.setServers(servers);
  24. pool.setFailover(true);
  25. pool.setInitConn(10); // 设置初始连接
  26. pool.setMinConn(5);// 设置最小连接
  27. pool.setMaxConn(250); // 设置最大连接
  28. pool.setMaxIdle(1000 * 60 * 60 * 3); // 设置每个连接最大空闲时间3个小时
  29. pool.setMaintSleep(30);
  30. pool.setNagle(false);
  31. pool.setSocketTO(3000);
  32. pool.setAliveCheck(true);
  33. pool.initialize();
  34. }
  35.  
  36. /**
  37. * 获取缓存管理器唯一实例
  38. *
  39. * @return
  40. */
  41. public static MemcacheManagerForGwhalin getInstance() {
  42. return INSTANCE;
  43. }
  44.  
  45. public void add(String key, Object value) {
  46. cachedClient.set(key, value);
  47. }
  48.  
  49. public void add(String key, Object value, int milliseconds) {
  50. cachedClient.set(key, value, milliseconds);
  51. }
  52.  
  53. public void remove(String key) {
  54. cachedClient.delete(key);
  55. }
  56.  
  57. public void remove(String key, int milliseconds) {
  58. cachedClient.delete(key, milliseconds, new Date());
  59. }
  60.  
  61. public void update(String key, Object value, int milliseconds) {
  62. cachedClient.replace(key, value, milliseconds);
  63. }
  64.  
  65. public void update(String key, Object value) {
  66. cachedClient.replace(key, value);
  67. }
  68.  
  69. public Object get(String key) {
  70. return cachedClient.get(key);
  71. }
  72.  
  73. public static void main(String[] args) {
  74. //将对象加入到memcached缓存
  75. cachedClient.add("keke", "This is a test String");
  76. //从memcached缓存中按key值取对象
  77. String result = (String) cachedClient.get("keke");
  78. System.out.println(result);
  79. }
  80.  
  81. }  

Spymemcached

官网:http://code.google.com/p/spymemcached/

这个是不错的选择,但是有吭,在GitHub上找不到。

  1. public class MemcacheManagerForSpy implements IMemcacheManager {
  2. // 缓存客户端
  3. private MemcachedClient memcacheCient;
  4. // Manager管理对象,单例模式
  5. private static MemcacheManagerForSpy INSTANCE = new MemcacheManagerForSpy();
  6.  
  7. private MemcacheManagerForSpy() {
  8. try {
  9. memcacheCient = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14.  
  15. public static MemcacheManagerForSpy getInstance() {
  16. return INSTANCE;
  17. }
  18.  
  19. @Override
  20. public void add(String key, Object value, int milliseconds) {
  21. memcacheCient.add(key, milliseconds, value);
  22. }
  23.  
  24. @Override
  25. public void add(String key, Object value) {
  26. memcacheCient.add(key, 3600, value);
  27.  
  28. }
  29.  
  30. @Override
  31. public void remove(String key, int milliseconds) {
  32. memcacheCient.delete(key);
  33. }
  34.  
  35. @Override
  36. public void remove(String key) {
  37. memcacheCient.delete(key);
  38. }
  39.  
  40. @Override
  41. public void update(String key, Object value, int milliseconds) {
  42. memcacheCient.replace(key, milliseconds, value);
  43. }
  44.  
  45. @Override
  46. public void update(String key, Object value) {
  47. memcacheCient.replace(key, 3600, value);
  48. }
  49.  
  50. @Override
  51. public Object get(String key) {
  52. return memcacheCient.get(key);
  53. }
  54. }

Xmemcached

官网:https://github.com/killme2008/xmemcached

操作指南:https://github.com/killme2008/xmemcached/wiki/Xmemcached%20%E4%B8%AD%E6%96%87%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97

目前最火,且时长更新,截止今天都还在更新。

  1. import java.io.IOException;
  2. import java.util.concurrent.TimeoutException;
  3. import net.rubyeye.xmemcached.utils.AddrUtil;
  4. import net.rubyeye.xmemcached.MemcachedClient;
  5. import net.rubyeye.xmemcached.MemcachedClientBuilder;
  6. import net.rubyeye.xmemcached.XMemcachedClientBuilder;
  7. import net.rubyeye.xmemcached.exception.MemcachedException;
  8. public class TestXMemcache {
  9.  
  10. public static void main(String[] args) {
  11. MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("10.11.15.222:10000"));
  12. MemcachedClient memcachedClient;
  13. try {
  14. memcachedClient = builder.build();
  15. memcachedClient.set("hello", 0, "Hello,xmemcached");
  16. String value = memcachedClient.get("hello");
  17. System.out.println("hello=" + value);
  18. memcachedClient.delete("hello");
  19. value = memcachedClient.get("hello");
  20. System.out.println("hello=" + value);
  21. // close memcached client
  22. memcachedClient.shutdown();
  23. } catch (MemcachedException e) {
  24. System.err.println("MemcachedClient operation fail");
  25. e.printStackTrace();
  26. } catch (TimeoutException e) {
  27. System.err.println("MemcachedClient operation timeout");
  28. e.printStackTrace();
  29. } catch (InterruptedException e) {
  30. // ignore
  31. } catch (IOException e) {
  32. System.err.println("Shutdown MemcachedClient fail");
  33. e.printStackTrace();
  34.  
  35. }
  36.  
  37. }
  38.  
  39. }

参考:

http://blog.csdn.net/xuke6677/article/details/38706501

http://blog.csdn.net/hardy008/article/details/37738901

http://blog.csdn.net/arui_email/article/details/8129400

http://blog.csdn.net/heiyueya/article/details/64441901

http://exceptioneye.iteye.com/blog/1927741

http://blog.csdn.net/hengyunabc/article/details/20735701(缓存失效后的策略处理)

Memcached的几种Java客户端(待实践)的更多相关文章

  1. Memcached 集群环境Java客户端

    Memcached 集群环境Java客户端 学习了: http://blog.csdn.net/zhouzhiwengang/article/details/53154112 http://guazi ...

  2. JAVA客户端API调用memcached两种方式

    1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...

  3. memcached学习——常用命令+基于java客户端的3种简单实现(二)

    常用命令: memcached设计的原则就是简单,所以支持的命令也不是特别多~ 1.查看memcached的状态,主要用于分析内存的使用状况.优化内存分配等 stats 查看memcached的运行状 ...

  4. 由Memcached升级到 Couchbase的 Java 客户端的过程记录(一)

    背景: 在项目启动的选用了Memcached 作为缓存服务器,采用了Xmemcached作为客户端.在项目中使用了Shiro,为了给 Shiro 配置缓存的时候,采用了开源代码   https://g ...

  5. 缓存系统MemCached的Java客户端优化历程

    Memcached 是什么? Memcached是一种集中式Cache,支持分布式横向扩展.这里需要解释说明一下,很多开发者觉得Memcached是一种分布式缓存系统,但是其实Memcached服务端 ...

  6. 转: memcached Java客户端spymemcached的一致性Hash算法

    转自:http://colobu.com/2015/04/13/consistent-hash-algorithm-in-java-memcached-client/ memcached Java客户 ...

  7. Memcached学习笔记 — 第四部分:Memcached Java 客户端-gwhalin(1)-介绍及使用

     介绍 Memcached java client是官方推荐的最早的memcached java客户端.最新版本:java_memcached-release_2.6.1. 官方下载地址:http ...

  8. 读Java并发编程实践中,向已有线程安全类添加功能--客户端加锁实现示例

    在Java并发编程实践中4.4中提到向客户端加锁的方法.此为验证示例,写的不好,但可以看出结果来. package com.blackbread.test; import java.util.Arra ...

  9. 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍

    转载地址:http://blog.csdn.net/truong/article/details/46711045 关键字:Redis的Java客户端Jedis的八种调用方式(事务.管道.分布式…)介 ...

随机推荐

  1. VB6程序中NULL注意事项

    VB6中从数据库中取出栏位值进行操作,若栏位值为Null,则必须小心处理,否则极易导致程序出错退出. 通常我们从recordset中取出栏位值采用Fields方法,加上栏位名称,如 rsMoney.F ...

  2. NOT IN、NOT EXISTS的相关子查询改用LEFT JOIN--sql2000性能优化

    参考文章:SQL SERVER性能优化综述(很好的总结,不要错过哦) 数据库:系统数据库 子查询的用法 子查询是一个 SELECT 查询,它嵌套在 SELECT.INSERT.UPDATE.DELET ...

  3. 什么是LambdaExpression,如何转换成Func或Action(2)

    序言 在上一篇中,我们认识了什么是表达式树.什么是委托,以及它们的关系.可能是我功力不好,貌似大家都不怎么关注,没有讲解出不同角度的问题. 学习一种新技术,是枯燥的过程,只有在你掌握后并能运用时才能从 ...

  4. Zed Shaw:程序员的常见健康问题

    Zed Shaw:程序员的常见健康问题 原文作者Zed Shaws是一位作家.软件开发人员.音乐人(下文中提到吉他手),于2010年发布<Learn Python The Hard Way> ...

  5. nutz配置druid监控

    druid 提供了一个web端的监控页面, 搭建起来不算麻烦, 建议添加. 打开web.xml, 在nutz的filter之前, 加入Web监控的配置 <filter> <filte ...

  6. 自动交互脚本之expect使用记录

    之前一直没怎么用这个命令,意外用了一下,还不错,那这个是干嘛的呢 我们或多或少会远程登录其他服务器,需要执行某项任务,通常需要手动接入,输入密码啊,等等 那我们如何有效的自动执行呢,expect可以解 ...

  7. 08JavaScript数学与日期时间对象

    JavaScript数学与日期时间对象 5.1.3数学(Math)对象 <script> //欧拉常量,自然对数的底(约等于2.718); document.write(Math.E+&q ...

  8. html嵌入pdf && html嵌入多媒体文件,word,flash,pdf,音视频

    <object classid="clsid:CA8A9780-280D-11CF-A24D-444553540000" width="1000" hei ...

  9. Danfoss Motor - Automotive Motor: What Sensors Are There?

    The   Danfoss Motor     states that the motor sensor control system is the heart of the entire autom ...

  10. redis的安装总结

    1. 下载redis安装包:> 可以用命令: wget http://download.redis.io/releases/redis-5.0.5.tar.gz, 或者直接从官网下载.2. 解压 ...