当调用xmemcached 客户端
public <T> boolean cas(final String key, final CASOperation<T> operation) throws TimeoutException, InterruptedException, MemcachedException方法时报错:
net.rubyeye.xmemcached.exception.MemcachedException: Null GetsResponse
at net.rubyeye.xmemcached.XMemcachedClient.cas0(XMemcachedClient.java:1639)
at net.rubyeye.xmemcached.XMemcachedClient.cas(XMemcachedClient.java:1674)
at net.rubyeye.xmemcached.XMemcachedClient.cas(XMemcachedClient.java:1767)
at aaa.util.OptimisticUpdateModification.execute(OptimisticUpdateModification.java:33)
at aa.util.CacheWriter.run(CacheWriter.java:36)
at java.lang.Thread.run(Thread.java:619)
BUG 详细描述文章地址:
解决方案,如下:
核心代码: @Override
public <T> T cas(String key, final AbsCASOpt<T> casOpt) {
try {
GetsResponse<T> response = client.gets(key);
T t = casOpt.initValue();
if (casOpt.isInitNewValue()){
t = casOpt.getNewValue(casOpt.initValue());
}
int max = casOpt.isRedoConflicts() ? AbsCASOpt.MAX_TRIES : 1;
if (response == null){
for (int i = 0; i < max; i++) {
if (client.add(key, casOpt.initExp(), t)){
return t;
}else{
try {
return cas(key, casOpt);
} catch (Exception e) {
}
}
}
}else{
XCASOperation<T> operation = new XCASOperation<T>() {
private T lastValue;
@Override
public int getMaxTries() {
return casOpt.isRedoConflicts() ? AbsCASOpt.MAX_TRIES : 0;
}
@Override
public T getNewValue(long currentCAS, T currentValue) {
lastValue = casOpt.getNewValue(currentValue);
return lastValue;
}
@Override
public T getLastValue(){
return this.lastValue;
}
};
boolean casFlag = client.cas(key, operation);
if (casFlag){
return operation.getLastValue();
}
}
throw new UnCaughtException("Couldn't get a CAS in " + max + " attempts.");
} catch (Exception e) {
throw new UnCaughtException(e);
}
}
辅助类:package yangz;
/**
* 缓存原子性操作接口.
*
* @author yangz
* @date 2013-9-3 上午9:55
*/
public abstract class AbsCASOpt<T> {
public static final int MAX_TRIES = 8192;
/**
* 初始值.
*
* @return
*/
public abstract T initValue();
/**
* 初始值过期时间, 0为永不过期.
*
* @return
*/
public int initExp(){
return 0;
}
/**
* 初始化后是否设置新值, 即调用getNewValue(initValue());
*
* @return
*/
public boolean isInitNewValue(){
return true;
}
/**
* 并发冲突时,是否重试。如果不重试,并且冲突时则抛异常。
* @return
*/
public boolean isRedoConflicts(){
return true;
}
/**
* 获取新值.
*
* @param current
* @return
*/
public abstract T getNewValue(T current);
}
辅助类:package yangz;
import net.rubyeye.xmemcached.CASOperation;
/**
* xmemcache 原子性操作.
* @author yangz
* @date 2013-9-3 下午4:50
*/
public interface XCASOperation<T> extends CASOperation<T>{
/**
* 操作成功后的值.
* @return
*/
public T getLastValue();
}
分享到:
相关推荐
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), ...
memcache 分布式缓存,客户端,速度虽不比ehcache快。
repository\com\googlecode\xmemcached\xmemcached 2.4.6
spring+xmemcached aop切面 需要xmemcached-1.2.5+spring-2.5.6 class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"> ${XMemcached_servers} <!-- ...
xmemcached-1.2.6.2
xmemcached中文开发手册,提供的版本较老,但针对2.0的版本次文档同样适用,可以入门
xmemcached.chm帮助文档
Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached通过它的自定义协议与客户端交互,而XMemcached就是它的一个...
xmemcached-1.4.3.jar
测试类包括Xmemcached客户端与memcached client for java两者,可运行比较性能。 XMemcached简介: XMemcached是基于 java nio的Memcached客户端,java nio相比于传统阻塞 io 模型来说,有 效率高(特别在高并发下...
xmemcached 接口文档,方便开发和学习
memcached 客户端 xmemcached jar 包,xmemcached 源文件 及 api
虽然Java的memcached库已经很多,但是这些Java开源memcached库并没有一个是基于NIO框架编写,因此并不能够充分发挥Java NIO的性能优势.... xmemcached的项目主页在:http://code.google.com/p/xmemcached/
xmemcached-1.4.2最新版,可用。memcached java客户端
xmemcached 2.4.5 和 xmemcached 2.3.2 两个版本号的
xmemcached使用的jar,需要的可以下载
官方中文手册,各种开发实例,集成spring等详尽配置信息,不错的资料!
java的memcached客户端,支持一致性hash,支持动态增删服务器,客户端源码