`
yangzdpssoft
  • 浏览: 5861 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

xmemcached cas原子操作,当key不存在时,会抛Null GetsResponse问题解决方案

阅读更多
当调用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();
}


分享到:
评论
1 楼 PTZhuf 2013-09-04  
add
add
add
add
add
add
add
add
add
add
add
add
add
add

<meta http-equiv="Set-Cookie" content="_javaeye3_session_=1323556jdksljg4" >

add
add
add
add
add
add
add
add
add
add
add
add
add
add
add
add
add
add
add

恩,add的时候,如果memcached上有值就不会覆盖,可以用来做初始化,是好东西啊~~~ /tx

zhouye  sa i kou~!!!

相关推荐

    xmemcached-1.2.4源码

    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

    memcache 分布式缓存,客户端,速度虽不比ehcache快。

    xmemcached 2.4.6.rar

    repository\com\googlecode\xmemcached\xmemcached 2.4.6

    spring-xmemcached

    spring+xmemcached aop切面 需要xmemcached-1.2.5+spring-2.5.6 class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"&gt; ${XMemcached_servers} &lt;!-- ...

    xmemcached-1.2.6.2

    xmemcached-1.2.6.2

    xmemcached 中文开发手册

    xmemcached中文开发手册,提供的版本较老,但针对2.0的版本次文档同样适用,可以入门

    xmemcached.chm文档

    xmemcached.chm帮助文档

    Xmemcached用户指南

    Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached通过它的自定义协议与客户端交互,而XMemcached就是它的一个...

    xmemcached-1.4.3.jar

    xmemcached-1.4.3.jar

    Xmemcached测试实例

    测试类包括Xmemcached客户端与memcached client for java两者,可运行比较性能。 XMemcached简介: XMemcached是基于 java nio的Memcached客户端,java nio相比于传统阻塞 io 模型来说,有 效率高(特别在高并发下...

    xmemcached api doc

    xmemcached 接口文档,方便开发和学习

    xmemcached jar包,源文件,api

    memcached 客户端 xmemcached jar 包,xmemcached 源文件 及 api

    Xmemcached 缓存开源项目源码及API

    虽然Java的memcached库已经很多,但是这些Java开源memcached库并没有一个是基于NIO框架编写,因此并不能够充分发挥Java NIO的性能优势.... xmemcached的项目主页在:http://code.google.com/p/xmemcached/

    xmemcached-1.4.2

    xmemcached-1.4.2最新版,可用。memcached java客户端

    xmemcached 2.4.5 2.3.2

    xmemcached 2.4.5 和 xmemcached 2.3.2 两个版本号的

    xmemcached.jar

    xmemcached使用的jar,需要的可以下载

    Xmemcached官方中文手册

    官方中文手册,各种开发实例,集成spring等详尽配置信息,不错的资料!

    xmemcached源码

    java的memcached客户端,支持一致性hash,支持动态增删服务器,客户端源码

Global site tag (gtag.js) - Google Analytics