论坛首页 Java企业应用论坛

XMemcached介绍(发布1.10-RC1)

浏览 17421 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-03-04   最后修改:2009-04-28

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();
   
 

 

 


    测试所用类下载

 

   发表时间:2009-03-04  
对yanf4j很感兴趣

Reactor 好像就是cindy的那个

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

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

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



0 请登录后投票
   发表时间:2009-03-04   最后修改:2009-03-05
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阻塞读写)和我想要的功能,做了大幅度简化,只提供非阻塞模型。
0 请登录后投票
   发表时间:2009-03-04   最后修改:2009-03-04
哦 这个是你写的呀 呵呵 太好了 你qq号告诉我吧 多多向你请教
0 请登录后投票
   发表时间: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了。
0 请登录后投票
   发表时间:2009-03-06  
支持原创,开源,和性能改进。

spymemcached之前在部分项目中的hibernate缓存有用, 性能不错, 对集群支持很好。
希望楼主继续推出对集群的支持。
0 请登录后投票
   发表时间:2009-03-06  

最新测试结果,xmemcached发布0.60版本

 

 

测试1:开N个线程读写删各10000次,key是String,Value是Integer,数据单位皆为TPS

 线程数           set            get          delete
   xmemcached  spymemcached  xmemcached spymemcached
 xmemcached spymemcached
 1  3368  3047  3422  3232  3787  3404
 10  12307  11742  15274  12623  13473  13473
 50  22115  23021  30769  22630  24483  23222
 100  22448  25467  32569  24105  25538  28119
 200  24187  26165  35320  21379  26683  28181
 500  24623  28810  36955  14328  27609  29789





观察下结果,明显的一点是xmemcached的get比之spyememcached快得多,考虑到memcached是作为缓存使用,这一点很重要。在set、delete上面仍然比spymemcached稍有不如,但是差距已经很小。



测试2:开N个线程读写各100次,key是String,Value是100个元素的map(map的key和value分别是String和一个自定义类NameClass),memcached内存加大,防止lru起作用。

 线程数           set            get
   xmemcached  spymemcached  xmemcached spymemcached
 1  492  377  581  531
 10  1362  84  831  753
 30  1536  66  1015  872
 50  1608  68  1126  1084
 100  1576  67  989  1347


  
 观察数据结果,难以理解的是spymemcached在写集合方面竟然如此低效,通过jprofiler观察两者的CPU占用,最大头的都是序列化自定 义对象;不过我昨天在ubuntu下开发xmemcached的时候随手测过,spymemcached写集合并没有在windows下这么慢。

    以上测试数据使用的memcached是2.2版本,xmemcached是0.6版本,系统是windows xp,AMD双核2G内存,memcached是跑在局域网内的服务器上,版本是1.2.2。linux下的测试数据等晚上回家补上。


  


0 请登录后投票
   发表时间:2009-03-06  
LZ的贴图是用什么工具画的?
0 请登录后投票
   发表时间:2009-03-07  
pandonix 写道
LZ的贴图是用什么工具画的?

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

0 请登录后投票
   发表时间:2009-03-07  

  linux下的测试报告

 

   翠花,上图,首先是容器类和自定义对象的get、set在不同并发下的表现





    很明显,在linux下,spymemcached读写复杂对象的效率远远超过在windows下的表现,xmemcached在两个平台之间表现平稳, 在linux上get效率低于spymemcached,差距比较大,准备再优化下;set效率略高于spymemcached。

    xmemcached  0.70将支持多服务器功能和简单的分布能力,基于hash key后模节点数的余数值做分布,这也是spymemcached默认的分布方式,一致性哈希暂不实现。下面是在linux下多节点情况下读写简单类型的效率对比





   两者都是在从一个节点到两个节点的变化中效率有一个显著下降,在2个节点到更多节点过程中下降的幅度开始减小,曲线变的相对平稳。

xmemcached路线图
0.70  多服务器和简单分布
0.80  更多memcached协议支持
0.90  一致性哈希算法的实现

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics