- 浏览: 940964 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hw7777777:
非常感谢作者提供这么好的工具,在使用的过程中遇到一些问题?1、 ...
基于java nio的memcached客户端——xmemcached -
SINCE1978:
多久过去了时间能抹平一切
无路用的人 -
fangruanyjq:
[img][/img]引用
用osworkflow写一个请假例子(提供代码下载) -
thinkingmysky:
楼主,你确定,java memached client能处理并 ...
memcached java client性能测试的几点疑问和说明 -
hellostory:
aaa5131421 写道07年2月hibernate已经出来 ...
dozer与BeanUtils
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修复。
memcached 1.2.4之后开始支持cas协议,该协议存储数据同时发送一个版本号,只有当这个版本号与memcached server上该key的最新版本一致时才更新成功,否则返回EXISTS,版本号的获取需要通过gets协议获得,cas全称就是compare and set,如果对hibernate乐观锁和java.util.concurrent.atomic包都比较熟悉的话这个概念应该很了解了。xmemcached 1.0-beta开始支持cas协议,看例子:
client.addServer( " localhost " , 11211 );
client.set( " a " , 0 , 1 ); // 设置a为1
GetsResponse result = client.gets( " a " );
long cas = result.getCas(); // 获取当前cas
// 尝试更新a成2
if ( ! client.cas( " a " , 0 , 2 , cas))
System.err.println( " cas error " );
XMemcachedClient.cas(final String key, final int exp, Object value, long cas)将尝试更新key的值到value,如果失败就返回false。这样搞好像很麻烦,需要先gets获取cas值,然后再调用cas方法更新,因此XMemcached提供了一个包装类可以帮你搞定这两步,并且提供重试机制:
* 合并gets和cas,利用CASOperation
*/
client.cas( " a " , 0 , new CASOperation() {
@Override
public int getMaxTries() {
return 10 ;
}
@Override
public Object getNewValue( long currentCAS, Object currentValue) {
System.out.println( " current value " + currentValue);
return 2 ;
}
});
通过CASOperation,你只要实现两个方法即可,
getMaxTries返回最大重试次数,超过这个次数还没有更新成功就抛出TimeoutException;
getNewValue方法返回依据当前cas和缓存值,你希望设置的更新值。
看一个cas更详细的例子,开100个线程递增缓冲中的变量a,采用cas才能保证最后a会等于100:
import net.rubyeye.xmemcached.CASOperation;
import net.rubyeye.xmemcached.XMemcachedClient;
/**
* 测试CAS
* @author dennis
*/
class CASThread extends Thread {
private XMemcachedClient mc;
private CountDownLatch cd;
public CASThread(XMemcachedClient mc, CountDownLatch cdl) {
super ();
this .mc = mc;
this .cd = cdl;
}
public void run() {
try {
if (mc.cas( " a " , 0 , new CASOperation() {
@Override
public int getMaxTries() {
return 50 ;
}
@Override
public Object getNewValue( long currentCAS, Object currentValue) {
System.out.println( " currentValue= " + currentValue
+ " ,currentCAS= " + currentCAS);
return ((Integer) currentValue).intValue() + 1 ;
}
}))
this .cd.countDown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class CASTest {
static int NUM = 100 ;
public static void main(String[] args) throws Exception {
XMemcachedClient mc = new XMemcachedClient();
mc.addServer( " 192.168.222.100 " , 11211 );
// 设置初始值为0
mc.set( " a " , 0 , 0 );
CountDownLatch cdl = new CountDownLatch(NUM);
// 开NUM个线程递增变量a
for ( int i = 0 ; i < NUM; i ++ )
new CASThread(mc, cdl).start();
cdl.await();
// 打印结果,最后结果应该为NUM
System.out.println( " result= " + mc.get( " a " ));
mc.shutdown();
}
}
最高重试次数设置成了50,观察输出你就会知道cas冲突在高并发下非常频繁,这个操作应当慎用。
说完cas,我们再来看下xmemcached对分布的支持。
1、如何添加多个memcached server?
通过XMemcachdClient.addServer(String ip,int port)方法,
mc.addServer(ip1, port1);
mc.addServer(ip2, port2);
mc.addServer(ip3, port3);
mc.addServer(ip4, port3);
2、怎么分布?
在添加了>=2个memcached server后,对XMemcachdClient的存储、删除等操作都将默认根据key的哈希值
模连接数
的余数做分布,这也是spymemcached默认的分布算法。这个算法简单快速,然而在添加或者移除memcached server后,缓存会大面积失效需要重组,这个代价太高,因此还有所谓
Consistent Hashing算法,通过将memcached节点分布在一个0-2^128-1的环上,发送数据到某个节点经过的跳跃次数可以缩减到O(lgn)次,并且在添加或者移除节点时最大限度的降低影响,这个算法的思想其实来源于p2p网络的路由算法,不过路由算法比这个复杂多了,毕竟memcached的分布是在客户端
,因此不需要节点之间的通讯和路由表的存储更新等。这个算法在java上的实现可以通过TreeMap红黑树,具体可以参考这里
和这里
。
在xmemcached启动
Consistent Hashing如下:
client.addServer(ip, 12000 );
client.addServer(ip, 12001 );
client.addServer(ip, 11211 );
client.addServer(ip, 12003 );
client.addServer(ip, 12004 );
散列函数采用CRC32,你也可以采用其他散列函数,具体看场景测试而定,散列函数决定了你的查找节点效率和缓存重新分布的均衡程度。
在完成1.0-beta
这个里程碑版本后,xmemcached将集中于稳定性方面的测试和性能优化。欢迎提交测试报告和建议,我的email killme2008@gmail.com
发表评论
-
memcached分布测试报告(一致性哈希情况下的散列函数选择)
2009-03-10 16:30 8552一、背景资料 memcached本身是集中式的缓存系统 ... -
xmemcached 0.60 优化过程
2009-03-06 14:37 3533充分利用jprofile等 ... -
Xmemcached vs Spymemcached 3th(linux下测试结果和多节点下表现)
2009-03-07 10:43 4891翠花,上图,首先是容器类和自定义对象的get、set在不同并发 ... -
山寨nio框架yanf4j发布0.50-alpha
2009-02-04 19:28 4227俺的山寨nio框架yanf4j发布0.50-alpha版本,下 ... -
yanf4j引入了客户端非阻塞API
2009-02-19 00:15 3127yanf4j 发布一个0.50-beta2 版本,这个版本最 ... -
基于java nio的memcached客户端——xmemcached
2009-03-03 16:31 74901、xmemcached是什么? xmemcached是基于 ... -
使用yanf4j写个简单聊天室
2008-11-26 11:36 5403yanf4j 简介,请看这里 ... -
Java字符串的最大长度
2009-01-15 01:37 7589在cpp中为了可移植性,s ... -
yanf4j-0.41 beta发布
2009-01-20 14:01 1870项目名称:yanf4j (yet another nio fr ... -
再谈Selector的wakeup方法
2009-02-01 11:15 3057过去推荐过两篇blog《Java NIO类库Selector机 ... -
Yet another nio framework for java
2008-10-11 14:25 2054项目名称:Yanf4j(Yet another nio fra ... -
阻塞队列的性能对比
2008-09-08 10:06 5746阻塞队列的性能对 ... -
java package的设计原则
2008-09-06 00:15 2119典型的J2EE项目,package的设计有成熟的套路可 ... -
线程池池
2008-09-01 19:39 2000这个题目比较怪,听俺道来。俺一直在负责公司游戏服 ... -
第一个MapReduce任务
2008-08-23 11:10 2786前两天在公司内网上搭了个2个节点hadoop集群, ... -
从HDFS看分布式文件系统的设计需求
2008-08-15 22:39 8121分布式文件系统的 ... -
HDFS用户指南(翻译)
2008-08-14 20:27 2142HDFS用户指南 原文地址:http:/ ... -
Ehcache配置的overflowToDisk属性
2008-08-06 23:18 10840Ehcache的overflowToDisk属性用来配 ... -
工作的几个tip
2008-07-07 20:47 28871、如果用java6的ScriptEngineManager ... -
NIO的SelectableChannel关闭的一个问题
2008-06-18 01:53 7184SocketChannel和ServerSocket ...
相关推荐
plexus-jetty-httpd-1.0-beta-1.jar plexus-utils-1.0.2.jar plexus-utils-1.0.4.jar plexus-utils-1.2.jar plexus-utils-1.3.jar plexus-utils-1.4.1.jar plexus-utils-1.4.2.jar plexus-utils-1.4.5.jar plexus-...
xmemcached1.3.5源码-附带自己写的RMI调用它的JMX服务,使用RMI调用JMX服务的详细过程,完整的eclipse工程,直接导入即可用。还用一些运行截图,很有用。 自己写的例子,类名是BaseExample 和RMITest.
xmemcached-1.4.3.jar
### Xmemcached用户指南知识点详解 #### 一、XMemcached简介 XMemcached是一款针对Java平台设计的高性能Memcached客户端。Memcached是一种分布式内存对象缓存系统,主要用于减轻数据库负担,提高动态Web应用程序的...
xmemcached-1.2.6.2
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-1.3.3-sources.jar`包含了xmemcached的源代码,可以帮助开发者了解其内部实现机制,如连接管理、命令编码与解码、并发控制等,便于定制化开发和优化性能。 - `xmemcached-1.3.3-javadoc.jar`提供了...
xmemcached-1.4.2最新版,可用。memcached java客户端
还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 xmemcached-1.2.5.jar
xmemcached最新版本2.0.0.0
《Xmemcached用户指南:Java后端开发详解》 Xmemcached是一款高性能、易用的Java客户端库,专为Memcached缓存系统设计。本文档将深入探讨如何使用Xmemcached进行后端开发,帮助Java开发者更好地理解和利用这一强大...
**Xmemcached:分布式缓存解决方案** Xmemcached是一款基于Java编写的高性能、高可用性的Memcached客户端库,由Kafka的创始人Jay Kreps开发。它提供了丰富的功能和优秀的性能,使得在Java应用中集成和使用Memcached...
需要xmemcached-1.2.5+spring-2.5.6 class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"> ${XMemcached_servers} <!-- server's weights --> ...
1.2.5版之后,yanf4j已经被整合入XMemcached本身,无需额外依赖。 #### 使用指南 - **依赖包**:XMemcached依赖于SLF4J日志框架。 - 对于使用Maven构建项目的用户,可以通过简单的依赖声明(如上述示例)轻松集成...
新闻发布,支持MemcachedSessionComparator和resolveInetAddresses设置并调整基准测试项目。 发布后,通过XMemcachedClientFactoryBean设置timeoutExceptionThreshold。 发布,错误修复。介绍XMemcached是Java中的一...
**Xmemcached官方中文手册** 是一份非常宝贵的资源,它为开发者提供了全面的关于Xmemcached框架的指导和实例。Xmemcached是一个高性能、轻量级的Java客户端库,专门用于连接和操作Memcached分布式内存缓存系统。这份...
《深入解析xmemcached 2.4.6:构建高效分布式缓存系统》 xmemcached是Java领域中一个高效、稳定且易于使用的Memcached客户端库,它为开发者提供了便捷的接口来操作Memcached服务器。在2.4.6这个版本中,xmemcached...
xmemcached使用的jar,需要的可以下载
aopalliance-1.0.jar asm-3.1.jar aspectjrt-1.6.0.jar aspectjtools-1.6.0.jar aspectjweaver-1.6.0.jar bcprov-jdk16-1.46.jar c3p0-0.9.1.2.jar cas-client-core-3.3.3.jar cglib-2.2.2.jar commons-...