论坛首页 Java企业应用论坛

Memcached Java客户端2.6.1发布

浏览 6842 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-05  
taolei0628 写道
昨天下载了使用一下,不过这种客户端很多,我不确定是不是你的。
是这个吗?com.danga.MemCached.MemCachedClient

里面使用了socket连接池,对吗?每次交互都单独使用一个连接,我做了一下16个线程的并发压力测试,结果建立了16个服务器连接。
在小数据读写的时候,这样做效率不高。
每个服务器使用连接多了也没有用,毕竟网络带宽就那么多,如果你只使用一个,或者更少量连接,可以合并发送和接收数据。性能会有提高。

我是这个客户端的作者。
连接池默认起32个连接,你也可以通过SockIOPool类的public void setMaxConn(int maxConn)方法设置连接池的大小呀。
0 请登录后投票
   发表时间:2011-07-05  
我的意思是说你的机制是每次访问使用单独的连接,在小数据的时候,网络数据包碎片很多,要把请求合并才能更有效利用网络。
使用连接池的机制就算把它调小一样也不会合并数据,只是被阻塞等待可用连接而已,反而会更慢。

我刚测试了一下,16个线程的小数据压力并发,16个连接时每秒13000次,限制到4个连接后就只有每秒7400次了。
0 请登录后投票
   发表时间:2011-07-06  
taolei0628 写道
我的意思是说你的机制是每次访问使用单独的连接,在小数据的时候,网络数据包碎片很多,要把请求合并才能更有效利用网络。
使用连接池的机制就算把它调小一样也不会合并数据,只是被阻塞等待可用连接而已,反而会更慢。

我刚测试了一下,16个线程的小数据压力并发,16个连接时每秒13000次,限制到4个连接后就只有每秒7400次了。

memcached协议不支持的话,合并请求无法实现吧。
你有什么实现方法的建议吗?
0 请登录后投票
   发表时间:2011-07-06  
taolei0628 写道
我的意思是说你的机制是每次访问使用单独的连接,在小数据的时候,网络数据包碎片很多,要把请求合并才能更有效利用网络。
使用连接池的机制就算把它调小一样也不会合并数据,只是被阻塞等待可用连接而已,反而会更慢。

我刚测试了一下,16个线程的小数据压力并发,16个连接时每秒13000次,限制到4个连接后就只有每秒7400次了。

刚想了一下,其实memcached协议支持multi-get,我们的客户端也实现这个操作的,这相当于也实现了get操作的合并。只是现在协议还没有multi-set
0 请登录后投票
   发表时间:2011-07-06  
像HTTP pipeline一样,可以连续发set
multi-get可以做成自动合并,如果有进程内并发的get,可以合并到一起。
java这边可以做到这些,memcached那边不知道,如果每个"STORED","NOT_STORED"都单独占一个包的话,java这边无能为力。
0 请登录后投票
   发表时间:2011-07-14  
恩,关注pipeline中get的自动合并,能做到这一点应该也会快些。不过这个里面不同key在不同的服务器,做起来可能有点麻烦吧。redis的pipeline挺好用的,不知道为什么memcached本身不支持这个。
0 请登录后投票
   发表时间:2011-07-14  
akandfxs 写道
恩,关注pipeline中get的自动合并,能做到这一点应该也会快些。不过这个里面不同key在不同的服务器,做起来可能有点麻烦吧。redis的pipeline挺好用的,不知道为什么memcached本身不支持这个。


memcached支持pipeline的,set的合并spymemcached有做。
0 请登录后投票
论坛首页 Java企业应用版

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