`
yangzdpssoft
  • 浏览: 5971 次
  • 性别: 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

    **Xmemcached:分布式缓存解决方案** Xmemcached是一款基于Java编写的高性能、高可用性的Memcached客户端库,由Kafka的创始人Jay Kreps开发。它提供了丰富的功能和优秀的性能,使得在Java应用中集成和使用Memcached...

    xmemcached api doc

    - **`add(String key, int exp, Object value)`**:只有当 key 不存在时,才添加 key-value 对。 - **`replace(String key, int exp, Object value)`**:只有当 key 已存在时,才替换其值。 - **`append(String key,...

    xmemcached-1.4.3.jar

    3. 错误处理:xmemcached具有健全的错误处理机制,对于网络异常、超时等问题,它会自动重试或抛出异常,帮助开发者快速定位问题。 4. 支持压缩:xmemcached允许用户配置是否启用数据压缩,以减少网络传输的开销,...

    Xmemcached官方中文手册

    **Xmemcached官方中文手册** 是一份非常宝贵的资源,它为开发者提供了全面的关于Xmemcached框架的指导和实例。Xmemcached是一个高性能、轻量级的Java客户端库,专门用于连接和操作Memcached分布式内存缓存系统。这份...

    xmemcached 2.4.6.rar

    总结,xmemcached 2.4.6作为一个强大的Memcached客户端,为开发者提供了高效、可靠的分布式缓存解决方案。通过合理运用其特性和功能,可以在大型分布式系统中构建出高性能的缓存层,显著提升整体系统的响应速度和...

    xmemcached jar包,源文件,api

    - **稳定可靠**:xmemcached支持自动故障切换和负载均衡,当连接到的Memcached服务器出现问题时,可以自动切换到其他健康的服务器,保证服务的稳定性。 - **丰富API**:提供了一套完整的Java API,包括基本的存取...

    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 中文开发手册

    - 在特定情况下(如存储较小的数据时),XMemcached的表现优于Spymemcached,这可以从相关的基准测试中得到验证。 2. **支持完整的协议**: - 完全兼容memcached协议,包括二进制协议,这是从1.4.0版本开始引入的...

    Xmemcached用户指南.pdf

    在实际应用中,确保正确配置和管理连接池至关重要,因为连接池能够提升并发处理能力,但需要保证数据之间的独立性,或者使用CAS(Check-And-Set)操作来保证操作的原子性。同时,监控JMX指标可以帮助了解系统运行状况...

    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用户指南知识点详解 #### 一、XMemcached简介 ...无论是对于希望减轻数据库负载的Web应用开发者,还是对于那些寻求高效内存缓存解决方案的专业人士而言,XMemcached都是一个值得考虑的强大工具。

    Xmemcached用户指南.docx

    此外,XMemcached还支持更复杂的操作,如批量操作、CAS(Compare and Swap)操作以及异常处理等。对于大型项目,可以通过配置连接池和一致性哈希策略来优化性能和数据分布。 总结,XMemcached作为Java环境下优秀的...

    xmemcached.chm文档

    xmemcached.chm帮助文档

    memcache.spymemcached,和xmemcached 三种缓存实例

    总的来说,memcache.spymemcached和xmemcached都是Java开发人员在使用Memcached时的重要工具,它们为Java应用程序提供了高效的缓存解决方案。了解并掌握这些客户端的特性和用法,对于提升应用程序性能和优化系统架构...

    Xmemcached测试实例

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

    Xmemcached一个java实现的分布式缓存

    - **自动故障转移**: 当连接到的Memcached服务器出现问题时,Xmemcached能够自动切换到其他健康的服务器,确保服务的连续性。 - **支持持久化**: 可以通过配置实现数据的持久化,防止服务器重启或故障时数据丢失。...

    xmemcached 2.4.5 2.3.2

    3. 错误处理与异常机制:新版本增强了错误报告和异常处理机制,当与Memcached服务器通信出现问题时,能够更准确地定位问题,提供给开发者更友好的错误信息。 4. 序列化方式扩展:2.4.5版本可能增加了新的序列化器...

    Xmemcached 缓存开源项目源码及API

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

Global site tag (gtag.js) - Google Analytics