发布
,从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协议,看例子:
xmemcachedclient client
=
new
xmemcachedclient();
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
java.util.concurrent.countdownlatch;
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)方法,
xmemcachedclient mc
=
new
xmemcachedclient();
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如下:
xmemcachedclient client
=
new
xmemcachedclient(
new
ketamamemcachedsessionlocator(hashalgorithm.crc32_hash));
client.addserver(ip,
12000
);
client.addserver(ip,
12001
);
client.addserver(ip,
11211
);
client.addserver(ip,
12003
);
client.addserver(ip,
12004
);
散列函数采用crc32,你也可以采用其他散列函数,具体看场景测试而定,散列函数决定了你的查找节点效率和缓存重新分布的均衡程度。
在完成
这个里程碑版本后,xmemcached将集中于稳定性方面的测试和性能优化。欢迎提交测试报告和建议,我的email killme2008@gmail.com
相关推荐
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是一个新java memcached client。也许你还不知道memcached是什么?可以先看看这里。简单来说,memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态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用户指南 后端 - java.zip
xmemcached-1.4.2最新版,可用。memcached java客户端
还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 xmemcached-1.2.5.jar
xmemcached最新版本2.0.0.0
需要xmemcached-1.2.5 spring-2.5.6 class="net.rubyeye.xmemcached.utils.xmemcachedclientfactorybean" destroy-method="shutdown"> ${xmemcached_servers} <!-- server's weights --> ...
新闻发布,支持memcachedsessioncomparator和resolveinetaddresses设置并调整基准测试项目。 发布后,通过xmemcachedclientfactorybean设置timeoutexceptionthreshold。 发布,错误修复。介绍xmemcached是java中的一...
xmemcached使用的jar,需要的可以下载
xmemcached中文开发手册,提供的版本较老,但针对2.0的版本次文档同样适用,可以入门
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-...
repository\com\googlecode\xmemcached\xmemcached 2.4.6
activemq-all-5.5.1.jar,aopalliance-1.0.jar,aspectj-1.8.6.jar,aspectjweaver.jar,bson-3.0.2.jar,c3p0-0.9.1.jar,commons-beanutils-1.8.3.jar,commons-collections-3.2.1.jar,commons-dbcp-1.4.jar,commons-io-...
memcache 分布式缓存,客户端,速度虽不比ehcache快。
xmemcached.chm帮助文档