`

XMemcached介绍(发布1.10-RC1)

阅读更多

xmemcached发布1.0-beta,从0.60直接到1.0-beta,主要改进如下:
1、支持更多协议,在已有协议支持的基础上添加了append、prepend、gets、批量gets、cas协议的支持,具体请查看XMemcachedClient类的实例方法。重点是cas操作。
2、memcached分布支持,支持连接多个memcached server,支持简单的余数分布和一致性哈希分布。
3、0.60版本以来的bug修复。

更多信息参考这里

 

 

1、xmemcached是什么?

 

基于java nio实现的memcached客户端API。

实际上是基于我实现的一个简单nio框架 http://code.google.com/p/yanf4j/的基础上实现的(目前是基于yanf4j 0.54),序列化机制直接挪用spymemcached的Transcoder。

性 能方面与spymemcached相比各有优势,spymemcached在windows和linux两个平台上的效率差异很大(特别是容器类大对象的 读写上),而xmemcached就没有这个问题,如果你的get操作远远多于存储操作,那么xmemcached对于get的优化在并发下的效果更加明 显。

当 前1.0-beta版本,支持memcached的分布式(余数哈希和一致性哈希算法)。目前已经支持get、set、add、replace、cas、 append、prepend、批量get/gets、delete、incr、decr、version这几个协议。API为阻塞模型,而非 spymemcached的异步模型,异步模型在批处理的时候有优势,但是阻塞模型在编程难度和使用上会容易很多。

后续计划:

1.0 正式稳定版

1.1 着重性能优化

 

 


 

2、为什么叫xmemcached?

因为我在厦门(XM)混饭......

3、xmemcached的下载和使用

项目主页:http://code.google.com/p/xmemcached/

下载地址:http://code.google.com/p/xmemcached/downloads/list

wiki地址:http://code.google.com/p/xmemcached/w/list

下载的压缩包中包括了依赖库、源码和打包后的jar,放到项目的lib目录下即可使用。

 

使用:

 

 import net.rubyeye.xmemcached.XMemcachedClient;
   ......
   ......
   //XMemcachedClient是线程安全的,可以被多线程使用
   XMemcachedClient client= new XMemcachedClient(ip, port);
   //存储操作
   if (!client.set("hello", 0, "dennis")){
        System.err.println("set error");
   }
   client.add("hello", 0, "dennis");
   client.replace("hello", 0, "dennis");

   //get操作
   String name=(String)client.get("hello");
   
   //批量获取
   List<String> keys=new ArrayList<String>();
   keys.add("hello");
   keys.add("test");
   Map<String,Object> map=client.get(keys);

   //delete操作
   if (!client.delete("hello",1000)){
        System.err.println("delete error");
   } 

   //incr,decr操作
   client.incr("a",4);
   client.decr("a",4);

   //查看memcached版本
   String version=client.version();
    
   client.shutdown();
   
 

 

 


    测试所用类下载

 

分享到:
评论
22 楼 erlengleng 2009-12-10  
楼主现在是不是被挖到阿里旗下了
21 楼 dennis_zane 2009-04-28  
<p>发布1.10-RC1版本,在我的测试中效率已经超过了spymemcached,其实TPS在10000以上已经可以满足大部分应用要求,测试报告和更多信息看<a href="http://www.blogjava.net/killme2008/archive/2009/04/28/267973.html" target="_blank">这里</a></p>
<p> </p>
20 楼 dennis_zane 2009-04-15  
crazycode 写道
问一下,批量get是什么原理?是组合成一个memcache请求吗?还是只是一个调用接口,内部还是多次memcache请求?


memcached的协议支持一次性get多个key,类似 get key1 key2 key3 ...

xmemcached会将连续的单独get操作合并成一个批量的get操作。
19 楼 crazycode 2009-04-15  
问一下,批量get是什么原理?是组合成一个memcache请求吗?还是只是一个调用接口,内部还是多次memcache请求?
18 楼 myreligion 2009-03-19  
楼主能否改进下memcached服务器端,让memcached在一个对象时效的时候,回调客户端通知java代码进行处理。
17 楼 dennis_zane 2009-03-10  
yulenice 写道
老兄,厦门什么公司

一家朋友的创业公司
16 楼 yulenice 2009-03-10  
老兄,厦门什么公司
15 楼 dennis_zane 2009-03-10  
bachmozart 写道
cindy的作者最初在写cindy这个框架时,还没有读UNP,并且那时也还没有c/c++服务器端开发的背景

在这点上楼主似乎有优势,呵呵,期待楼主分享更多高性能服务器端开发的经验


不敢当,cindy作者是原创,在nio框架初始的阶段能做出cindy那不是一般人能搞定的工作。我改写的yanf4j,其实还是为了自己练手nio,包括现在的xmemcached,也使我对memcached有更深入的理解。
14 楼 dennis_zane 2009-03-10  
<p> <a href="http://code.google.com/p/xmemcached/">xmemcached</a>发布<a href="http://code.google.com/p/xmemcached/downloads/list">1.0-beta</a>,从0.60直接到1.0-beta,主要改进如下:<br />
<strong>1、支持更多协议,在已有协议支持的基础上添加了append、prepend、gets、批量gets、cas协议的支持,具体请查看XMemcachedClient类的实例方法。重点是cas操作。<br />
2、memcached分布支持,支持连接多个memcached server,支持简单的余数分布和一致性哈希分布。<br />
3、0.60版本以来的bug修复。</strong></p>
<p> </p>
<p>更多信息参考<a href="http://www.blogjava.net/killme2008/archive/2009/03/09/258603.html">这里</a></p>
13 楼 bachmozart 2009-03-07  
cindy的作者最初在写cindy这个框架时,还没有读UNP,并且那时也还没有c/c++服务器端开发的背景

在这点上楼主似乎有优势,呵呵,期待楼主分享更多高性能服务器端开发的经验
12 楼 wing5jface 2009-03-07  
选题不错,要比CINDY更好呵!
11 楼 dennis_zane 2009-03-07  
<p> 

linux下的测试报告</p>
<p> </p>
<p>   翠花,上图,首先是容器类和自定义对象的get、set在不同并发下的表现<br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/killme2008/2211.png" height="330" alt="" width="460" /><br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/killme2008/2222.jpg.jpg" height="304" alt="" width="444" /><br />
<br />
   
很明显,在linux下,spymemcached读写复杂对象的效率远远超过在windows下的表现,xmemcached在两个平台之间表现平稳,
在linux上get效率低于spymemcached,差距比较大,准备再优化下;set效率略高于spymemcached。<br />
<br />
    xmemcached  0.70将支持多服务器功能和简单的分布能力,基于hash key后模节点数的余数值做分布,这也是spymemcached默认的分布方式,一致性哈希暂不实现。下面是在linux下多节点情况下读写简单类型的效率对比<br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/killme2008/2223.jpg" alt="" /><br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/killme2008/2224.jpg" alt="" /><br />
<br />
   两者都是在从一个节点到两个节点的变化中效率有一个显著下降,在2个节点到更多节点过程中下降的幅度开始减小,曲线变的相对平稳。<br />
<br />
xmemcached路线图<br />
0.70  多服务器和简单分布<br />
0.80  更多memcached协议支持<br />
0.90  一致性哈希算法的实现<br />
<br /></p>
10 楼 dennis_zane 2009-03-07  
pandonix 写道
LZ的贴图是用什么工具画的?

图表网
http://www.tubiao.net/

9 楼 土匪一份子 2009-03-06  
厦门的  支持一个
8 楼 pandonix 2009-03-06  
LZ的贴图是用什么工具画的?
7 楼 dennis_zane 2009-03-06  
<p>最新测试结果,xmemcached<a href="http://code.google.com/p/xmemcached/downloads/list">发布0.60版本</a></p>
<p> </p>
<p> </p>
<p>测试1:开N个线程读写删各10000次,key是String,Value是Integer,数据单位皆为TPS<br /></p>
<table cellspacing="2" border="1" style="border: 1px dashed #7f7c75;" cellpadding="2">
<tbody>
<tr>
<td style="border: 1px dashed #7f7c75;"> 线程数</td>
<td style="border: 1px dashed #7f7c75;" colspan="2">          set</td>
<td style="border: 1px dashed #7f7c75;" colspan="2">           get</td>
<td style="border: 1px dashed #7f7c75;" colspan="2">         delete <br />
            </td>
</tr>
<tr>
<td style="border: 1px dashed #7f7c75;"> </td>
<td style="border: 1px dashed #7f7c75;"> xmemcached</td>
<td style="border: 1px dashed #7f7c75;"> spymemcached</td>
<td style="border: 1px dashed #7f7c75;"> xmemcached</td>
<td style="border: 1px dashed #7f7c75;">spymemcached <br />
            </td>
<td style="border: 1px dashed #7f7c75;"> xmemcached</td>
<td style="border: 1px dashed #7f7c75;">spymemcached <br />
            </td>
</tr>
<tr>
<td style="border: 1px dashed #7f7c75;"> 1</td>
<td style="border: 1px dashed #7f7c75;"> 3368</td>
<td style="border: 1px dashed #7f7c75;"> 3047</td>
<td style="border: 1px dashed #7f7c75;"> 3422</td>
<td style="border: 1px dashed #7f7c75;"> 3232</td>
<td style="border: 1px dashed #7f7c75;"> 3787</td>
<td style="border: 1px dashed #7f7c75;"> 3404</td>
</tr>
<tr align="left" valign="middle">
<td style="border: 1px dashed #7f7c75;"> 10</td>
<td style="border: 1px dashed #7f7c75;"> 12307</td>
<td style="border: 1px dashed #7f7c75;"> 11742</td>
<td style="border: 1px dashed #7f7c75;"> 15274</td>
<td style="border: 1px dashed #7f7c75;"> 12623</td>
<td style="border: 1px dashed #7f7c75;"> 13473</td>
<td style="border: 1px dashed #7f7c75;"> 13473</td>
</tr>
<tr align="left" valign="middle">
<td style="border: 1px dashed #7f7c75;"> 50</td>
<td style="border: 1px dashed #7f7c75;"> 22115</td>
<td style="border: 1px dashed #7f7c75;"> 23021</td>
<td style="border: 1px dashed #7f7c75;"> 30769</td>
<td style="border: 1px dashed #7f7c75;"> 22630</td>
<td style="border: 1px dashed #7f7c75;"> 24483</td>
<td style="border: 1px dashed #7f7c75;"> 23222</td>
</tr>
<tr align="left" valign="middle">
<td style="border: 1px dashed #7f7c75;"> 100</td>
<td style="border: 1px dashed #7f7c75;"> 22448</td>
<td style="border: 1px dashed #7f7c75;"> 25467</td>
<td style="border: 1px dashed #7f7c75;"> 32569</td>
<td style="border: 1px dashed #7f7c75;"> 24105</td>
<td style="border: 1px dashed #7f7c75;"> 25538</td>
<td style="border: 1px dashed #7f7c75;"> 28119</td>
</tr>
<tr>
<td style="border: 1px dashed #7f7c75;"> 200</td>
<td style="border: 1px dashed #7f7c75;"> 24187</td>
<td style="border: 1px dashed #7f7c75;"> 26165</td>
<td style="border: 1px dashed #7f7c75;"> 35320</td>
<td style="border: 1px dashed #7f7c75;"> 21379</td>
<td style="border: 1px dashed #7f7c75;"> 26683</td>
<td style="border: 1px dashed #7f7c75;"> 28181</td>
</tr>
<tr align="left" valign="middle">
<td style="border: 1px dashed #7f7c75;"> 500</td>
<td style="border: 1px dashed #7f7c75;"> 24623</td>
<td style="border: 1px dashed #7f7c75;"> 28810</td>
<td style="border: 1px dashed #7f7c75;"> 36955</td>
<td style="border: 1px dashed #7f7c75;"> 14328</td>
<td style="border: 1px dashed #7f7c75;"> 27609</td>
<td style="border: 1px dashed #7f7c75;"> 29789</td>
</tr>
</tbody>
</table>
<p>
<br />
<img src="http://www.blogjava.net/images/blogjava_net/killme2008/compare1.jpg" border="0" alt="" /><img src="http://www.blogjava.net/images/blogjava_net/killme2008/compare2.jpg" border="0" alt="" /><br />
<br />
<br />
观察下结果,明显的一点是xmemcached的get比之spyememcached快得多,考虑到memcached是作为缓存使用,这一点很重要。在set、delete上面仍然比spymemcached稍有不如,但是差距已经很小。<br />
<br />
<br />
<br />
测试2:开N个线程读写各100次,key是String,Value是100个元素的map(map的key和value分别是String和一个自定义类NameClass),memcached内存加大,防止lru起作用。<br /></p>
<table cellspacing="2" border="1" style="border: 1px dashed #7f7c75;" cellpadding="2">
<tbody>
<tr>
<td style="border: 1px dashed #7f7c75;"> 线程数</td>
<td style="border: 1px dashed #7f7c75;" colspan="2">          set</td>
<td style="border: 1px dashed #7f7c75;" colspan="2">           get</td>
</tr>
<tr>
<td style="border: 1px dashed #7f7c75;"> </td>
<td style="border: 1px dashed #7f7c75;"> xmemcached</td>
<td style="border: 1px dashed #7f7c75;"> spymemcached</td>
<td style="border: 1px dashed #7f7c75;"> xmemcached</td>
<td style="border: 1px dashed #7f7c75;">spymemcached <br />
            </td>
</tr>
<tr>
<td style="border: 1px dashed #7f7c75;"> 1</td>
<td style="border: 1px dashed #7f7c75;"> 492</td>
<td style="border: 1px dashed #7f7c75;"> 377</td>
<td style="border: 1px dashed #7f7c75;"> 581</td>
<td style="border: 1px dashed #7f7c75;"> 531</td>
</tr>
<tr align="left" valign="middle">
<td style="border: 1px dashed #7f7c75;"> 10</td>
<td style="border: 1px dashed #7f7c75;"> 1362</td>
<td style="border: 1px dashed #7f7c75;"> 84</td>
<td style="border: 1px dashed #7f7c75;"> 831</td>
<td style="border: 1px dashed #7f7c75;"> 753</td>
</tr>
<tr align="left" valign="middle">
<td style="border: 1px dashed #7f7c75;"> 30</td>
<td style="border: 1px dashed #7f7c75;"> 1536</td>
<td style="border: 1px dashed #7f7c75;"> 66</td>
<td style="border: 1px dashed #7f7c75;"> 1015</td>
<td style="border: 1px dashed #7f7c75;"> 872</td>
</tr>
<tr align="left" valign="middle">
<td style="border: 1px dashed #7f7c75;"> 50</td>
<td style="border: 1px dashed #7f7c75;"> 1608</td>
<td style="border: 1px dashed #7f7c75;"> 68</td>
<td style="border: 1px dashed #7f7c75;"> 1126</td>
<td style="border: 1px dashed #7f7c75;"> 1084</td>
</tr>
<tr>
<td style="border: 1px dashed #7f7c75;"> 100</td>
<td style="border: 1px dashed #7f7c75;"> 1576</td>
<td style="border: 1px dashed #7f7c75;"> 67</td>
<td style="border: 1px dashed #7f7c75;"> 989</td>
<td style="border: 1px dashed #7f7c75;"> 1347</td>
</tr>
</tbody>
</table>
<p>
<br />
<img src="http://www.blogjava.net/images/blogjava_net/killme2008/compare3.jpg" border="0" alt="" />   <img src="http://www.blogjava.net/images/blogjava_net/killme2008/compare4.jpg" border="0" alt="" /><br />
 观察数据结果,难以理解的是spymemcached在写集合方面竟然如此低效,通过jprofiler观察两者的CPU占用,最大头的都是序列化自定
义对象;不过我昨天在ubuntu下开发xmemcached的时候随手测过,spymemcached写集合并没有在windows下这么慢。<br />
<br />
    以上测试数据使用的memcached是2.2版本,xmemcached是<a href="http://code.google.com/p/xmemcached/downloads/list">0.6版本</a>,系统是windows xp,AMD双核2G内存,memcached是跑在局域网内的服务器上,版本是1.2.2。linux下的测试数据等晚上回家补上。<br />
<br />
<br />
  
<br />
<br />
<br /></p>
6 楼 raymond2006k 2009-03-06  
支持原创,开源,和性能改进。

spymemcached之前在部分项目中的hibernate缓存有用, 性能不错, 对集群支持很好。
希望楼主继续推出对集群的支持。
5 楼 pandonix 2009-03-04  
bachmozart 写道
对yanf4j很感兴趣

Reactor 好像就是cindy的那个

我记得cindy里就是Reactor单线程处理注册事件,dispatcher事件,外部通过将感兴趣的事件加到Reactor的interestQueue里,由Reactor在beforeSelect时读取并注册,感兴趣的事件被触发交给另一个线程处理(filterChain)

也就是说cindy是1个dispatcher线程,1个workers线程,workers可以自己扩展(加个线程池什么的),说的不对的地方还请指出

我想问下yanf4j的线程模型,呵呵,这样看代码时能快点,o(∩_∩)o...




cindy里面的workers应该默认是1,具体数量是可配置的。在内部实现中,是一个worker线程数组()来对Dispatcher分发的任务进行处理的。
mina的线程模型其实跟cindy差不多,IoAcceptor采用executor线程池方式来调度worker线程,负责与客户端建立连接以及创建Session。IoProcessor也采用线程池方式,其worker线程负责轮询selector,如果当前的key可读取,则读取数据,并触发filterChain的messageRecevie方法(如果没有进行线程池扩展,所有的filter和IoHandler的messageRecv方法都在worker中被执行)。同时,IoProcessor还负责flush待发送数据的Session。
呵呵,yanf4j没有研究过,不好意思,感觉有点跑题了。权当冒个泡,别管我,大家继续!
PS:楼上的,难得遇到还有cindy的粉丝,幸会啊。Cindy当年是何等辉煌,国人在sf的骄傲啊。个人感觉完全强于mina的前身netty。自从Roger Chen去了HP,ms就停止了对cindy的维护。反观netty,被apache招安后,改名mina,作者都已经连续参加两届JavaOne了。
4 楼 whaosoft 2009-03-04  
哦 这个是你写的呀 呵呵 太好了 你qq号告诉我吧 多多向你请教
3 楼 dennis_zane 2009-03-04  
bachmozart 写道
对yanf4j很感兴趣

Reactor 好像就是cindy的那个

我记得cindy里就是Reactor单线程处理注册事件,dispatcher事件,外部通过将感兴趣的事件加到Reactor的interestQueue里,由Reactor在beforeSelect时读取并注册,感兴趣的事件被触发交给另一个线程处理(filterChain)

也就是说cindy是1个dispatcher线程,1个workers线程,workers可以自己扩展(加个线程池什么的),说的不对的地方还请指出

我想问下yanf4j的线程模型,呵呵,这样看代码时能快点,o(∩_∩)o...



yanf4j的线程模型是Selector.select跟OP_WRITE的处理共用一个线程,而OP_READ是可配置,默认是一个线程,也就是select、OP_READ和OP_WRITE的处理是1:1的配置,而对于message的派发默认是没有dispacher这个概念的,派发要多线程还是就是原read线程取决于应用层。yanf4j就是在cindy2.x的基础上改的,揉和一些grizzly的想法(如使用临时selector阻塞读写)和我想要的功能,做了大幅度简化,只提供非阻塞模型。

相关推荐

    Xmemcached用户指南 后端 - Java.zip

    1. **Xmemcached简介** Xmemcached是基于原生Memcached协议实现的Java客户端,提供了异步非阻塞I/O,具有低延迟、高并发的特性。其核心设计目标是优化性能和稳定性,为Java开发者提供一个轻量级、高效的Memcached...

    xmemcached-1.4.3.jar

    xmemcached-1.4.3.jar

    xmemcached-1.2.6.2

    xmemcached-1.2.6.2

    xmemcached1.3.5源码-附带自己写的RMI调用它的JMX服务

    xmemcached1.3.5源码-附带自己写的RMI调用它的JMX服务,使用RMI调用JMX服务的详细过程,完整的eclipse工程,直接导入即可用。还用一些运行截图,很有用。 自己写的例子,类名是BaseExample 和RMITest.

    Xmemcached用户指南

    **1. 高性能** - **基于Java NIO**:XMemcached采用了Java NIO技术,相比传统的阻塞I/O模型具有更高的效率,尤其是在高并发场景下。传统阻塞I/O通常需要通过创建多个连接来形成连接池以提高性能,而Java NIO仅需维持...

    xmemcached-1.2.4源码

    xmemcached-1.2.4的官方源码。 xmemcached XMemcached is a high performance, easy to use blocking multithreaded memcached client in java. It's nio based (using my opensource nio framework :yanf4j), ...

    Xmemcached一个java实现的分布式缓存

    下载并解压xmemcached-1.3.2压缩包,然后在项目中添加依赖,如果是Maven项目,可以在pom.xml中添加如下依赖: ```xml &lt;groupId&gt;net.rubyeye.xmemcached&lt;/groupId&gt; &lt;artifactId&gt;xmemcached &lt;version&gt;1.3.2 ...

    xmemcached jar包,源文件,api

    - `xmemcached-1.3.3-sources.jar`包含了xmemcached的源代码,可以帮助开发者了解其内部实现机制,如连接管理、命令编码与解码、并发控制等,便于定制化开发和优化性能。 - `xmemcached-1.3.3-javadoc.jar`提供了...

    spring-xmemcached

    需要xmemcached-1.2.5+spring-2.5.6 class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"&gt; ${XMemcached_servers} &lt;!-- server's weights --&gt; ...

    xmemcached-1.2.5.jar

    还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 xmemcached-1.2.5.jar

    xmemcached-1.4.2

    xmemcached-1.4.2最新版,可用。memcached java客户端

    xmemcached-2.0.0

    xmemcached最新版本2.0.0.0

    xmemcached

    1. **高性能**:Xmemcached利用NIO技术,实现了非阻塞I/O,提高了并发处理能力,确保在高负载下也能保持良好的性能。 2. **全面API支持**:提供丰富的API接口,支持命令行操作,如set、get、delete等,同时支持批量...

    Xmemcached官方中文手册

    手册中会详细介绍如何配置Spring XML文件以启用Xmemcached,以及如何在代码中使用Spring托管的Memcached客户端。 **5. 开发实例** 手册中的开发实例部分,通过具体的代码示例展示了如何使用Xmemcached进行缓存操作...

    xmemcached 中文开发手册

    ### xmemcached中文开发手册知识点解析 #### XMemcached简介 XMemcached是一款高效能的Java客户端库...通过本文的详细介绍,希望能帮助开发者更好地理解和运用XMemcached,进一步提升其开发的应用程序的性能和可靠性。

    xmemcached 2.4.6.rar

    1. **高性能**:xmemcached采用了非阻塞I/O模型,能够充分利用多核处理器的性能,提供高并发下的低延迟访问。 2. **易用性**:提供简单直观的API,使得开发者可以快速上手,实现Memcached的增删查改操作。 3. **健壮...

    xmemcached api doc

    1. **连接池管理**:xmemcached 支持连接池管理,允许多个客户端共享一组 Memcached 服务器连接,提高资源利用率和响应效率。 2. **命令编码与解码**:xmemcached 内部实现了高效的命令编码和解码机制,确保数据在...

    xmemcached.jar

    xmemcached使用的jar,需要的可以下载

    Xmemcached/jedis springdemo

    【Xmemcached/jedis Spring Demo】是一个整合了Xmemcached和jedis的Spring示例项目,旨在帮助开发者理解和学习如何在Spring框架中集成并使用这两种流行的NoSQL客户端库。Xmemcached是Java编写的高效、易用的...

Global site tag (gtag.js) - Google Analytics