`

spymemcached CAS操作

 
阅读更多
package spymemcached;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

import net.spy.memcached.CASValue;
import net.spy.memcached.MemcachedClient;
import net.spy.memcached.internal.OperationFuture;

/**
 * 
 * @author fairjm 
 * fair-jm.iteye.com
 *
 */
public class MemcachedCASSpec {

    public static final int CONCURRENT_THREAD_NUM = 100;

    public static void main(String[] args) throws IOException, InterruptedException {
        final MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.1.2.194", 11211));

        ExecutorService executor = Executors.newFixedThreadPool(CONCURRENT_THREAD_NUM);
        final CountDownLatch countDown = new CountDownLatch(CONCURRENT_THREAD_NUM);

        final AtomicInteger oks = new AtomicInteger(0);
        final AtomicInteger okThenModifieds = new AtomicInteger(0);

        for (int i = 0; i < CONCURRENT_THREAD_NUM; i++) {
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    Random ran = new Random(Thread.currentThread().getId()
                            + System.currentTimeMillis());
                    int num = ran.nextInt(10000);

                    boolean isOk = false;
                    while (!isOk) {
                        OperationFuture<Boolean> future;

                        CASValue<Object> oldValue = mc.gets("testKey");
                        // 不存在的情况 此时进行CAS操作 无论指定什么key 正常返回都会是NOT_FOUND需要手工插入
                        // 这里存在问题 需要用锁 实际使用进行CAS前最好保证key已经存在
                        if (oldValue == null) {
                            future = mc.set("testKey", 0, num);
                            try {
                                future.get();
                            } catch (InterruptedException | ExecutionException e) {
                                e.printStackTrace();
                            }
                            isOk = true;
                        } else {
                            switch (mc.cas("testKey", oldValue.getCas(), num)) {
                            case OK:
                                oks.incrementAndGet();
                                System.out.println("OK");
                                isOk = true;
                                break;
                            // key不存在的情况 需要进行add(set也可以)操作
                            case NOT_FOUND:
                                System.out.println("NOT_FOUND");
                                break;
                            // 冲突 现有的CASID低于memcached中的
                            case EXISTS:
                                System.out.println("Exists retry");
                                break;
                            // 参数有问题
                            case OBSERVE_ERROR_IN_ARGS:
                                System.out.println("error in args");
                                break;
                            // 操作超时
                            case OBSERVE_TIMEOUT:
                                System.out.println("timeout");
                                break;
                            // 操作成功 但是在观察期间又被修改了(更新成功后马上被修改)
                            case OBSERVE_MODIFIED:
                                System.out.println("succeed but modified then");
                                isOk = true;
                                okThenModifieds.incrementAndGet();
                                break;
                            }
                        }
                    }

                    countDown.countDown();
                }
            });
        }
        countDown.await();

        System.out.println("testKey:" + mc.get("testKey"));

        System.out.println("count:" + (oks.get() + okThenModifieds.get()));

        if (mc != null) {
            mc.shutdown();
        }
        executor.shutdown();

    }
}

 对memcached有版本要求 低版本不支持CAS

感觉怪怪的 key不存在的时候拿不到CAS ID也不能用CAS了....只有自己add(或set) 需要用锁....

分享到:
评论

相关推荐

    spymemcached-2.10.3

    - **操作类型**:支持GET、SET、DELETE等多种基本操作,以及CAS(Compare and Swap)原子操作,保证了数据的一致性。 - **序列化**:提供多种序列化策略,如Java序列化、FST序列化等,适应不同场景的需求。 - **...

    memcached与JAVA实例文档

    - 数据一致性:如果数据需要强一致,需要结合CAS操作来保证。 - 资源管理:合理分配内存资源,防止Memcached因内存耗尽而崩溃。 通过以上介绍,我们可以了解到Memcached在Java应用中的重要作用和使用方式。了解并...

    memcached-java链接所需jar包,以及java链接代码

    Memcached是一种高性能、分布式内存对象缓存系统,用于在分布式环境中快速...同时,理解Memcached的数据模型(如键值对、生存时间和CAS(Compare and Swap)操作)以及其工作原理,有助于更好地利用这个高效缓存系统。

    java环境下Memcached应用详解

    1. Spymemcached:由LinkedIn开发的Java客户端,它提供了简单的API接口,支持异步操作,性能出色。 2. Xmemcached:另一个流行的Java客户端,它提供了丰富的功能,如支持命令行参数,支持SSL连接,以及支持自动重连...

    Memcached之java客户端开发

    - **并发控制**:使用`CAS`(Compare and Swap)操作确保并发环境下的数据一致性。 通过以上介绍,我们可以看到使用Java客户端开发Memcached并不复杂,关键在于理解其工作原理,并结合业务需求进行有效利用。在实际...

    java连接memcached示例代码

    此外,对于大量数据操作,可以使用批量操作接口,如`append`、`prepend`、`cas`(比较并交换)等。 为了提高性能,Memcached采用了一种称为 slab 分配的内存管理机制,将内存分割成预定义大小的块,以避免内存碎片...

    Xmemcached用户指南.pdf

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

    Memcached缓存.zip

    - `gets(key)`: 类似于`get`,但返回带有CAS(Compare and Swap)标记的值,用于乐观锁操作。 #### 3. 删除操作 - `delete(key)`: 删除指定key的缓存项。 #### 4. 其他操作 - `incr(key, delta)`: 对key的值执行...

    memcached客户端所需jar包

    - **Key-Value操作**:基本的get、set、delete等操作,以及更复杂的操作如cas(check and set)用于保证数据一致性。 - **过期时间**:设置缓存项的生命周期,以便在指定时间后自动删除。 - **分布式哈希**:在多台...

    Xmemcached用户指南.docx

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

    Memcached java的使用实例

    为了实现更高效、安全的缓存策略,你可以进一步研究Memcached的特性,如CAS(Compare and Swap)操作、持久化、分布式哈希等。同时,了解如何在大型分布式系统中优化Memcached的配置和使用,以充分发挥其性能优势,...

    memcached官方jar和一些网上的资料

    - **数据一致性**:如果数据更新频繁,考虑使用CAS(Compare and Swap)操作来保证一致性。 - **分布式部署**:在多台服务器上部署Memcached,通过一致性哈希算法实现数据的均匀分布。 ### 其他相关资源 描述中的...

    memcache学习资料(包含memcache和java_memcache相应的jar)

    `java_memcache`相关的JAR文件通常包含了Java Memcached客户端库,如Xmemcached或spymemcached,这些库提供了API,让Java开发者能够方便地在Java应用中集成和使用Memcached服务。 在Windows环境下部署和使用...

    memcache缓存

    - **并发控制**:使用适当的并发控制机制,如CAS(Compare and Swap)操作,确保数据的一致性。 **6. 其他相关技术** 除了Memcache,还有许多类似的缓存系统,如Redis、MongoDB的缓存功能、Varnish等。这些系统各...

    缓存服务器memcached代码及使用文档

    - **缓存一致性**:在分布式环境中,需要考虑缓存与数据库的一致性问题,如使用缓存失效策略或更新时的CAS(Compare and Swap)操作。 - **监控与维护**:定期监控Memcached的性能指标,如命中率、内存使用情况,...

    Xmemcached用户指南

    需要注意的是,使用连接池时,必须确保数据之间的独立性或采用CAS操作以保持一致性。 **9. 可扩展性** - **基于Yanf4j框架**:XMemcached基于Java NIO框架Yanf4j构建,具有清晰的结构和良好的分层设计,易于扩展和...

Global site tag (gtag.js) - Google Analytics