`

Memcached的CAS方法

阅读更多
转至博客:http://blog.csdn.net/wxwzy738/article/details/23703635

Memcached的CAS协议
1. 什么是CAS协议

很多中文的资料都不会告诉大家CAS的全称是什么,不过一定不要把CAS当作中国科学院(China Academy of Sciences)的缩写。Google.com一下,CAS是什么?CAS是Check And Set的缩写。


2. CAS协议原文

http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt


3. CAS的基本原理

基本原理非常简单,一言以蔽之,就是“版本号”。每个存储的数据对象,多有一个版本号。我们可以从下面的例子来理解:

如果不采用CAS,则有如下的情景:

第一步,A取出数据对象X;

第二步,B取出数据对象X;

第三步,B修改数据对象X,并将其放入缓存;

第四步,A修改数据对象X,并将其放入缓存。

我们可以发现,第四步中会产生数据写入冲突。


如果采用CAS协议,则是如下的情景。

第一步,A取出数据对象X,并获取到CAS-ID1;

第二步,B取出数据对象X,并获取到CAS-ID2;

第三步,B修改数据对象X,在写入缓存前,检查CAS-ID与缓存空间中该数据的CAS-ID是否一致。结果是“一致”,就将修改后的带有CAS-ID2的X写入到缓存。

第四步,A修改数据对象Y,在写入缓存前,检查CAS-ID与缓存空间中该数据的CAS-ID是否一致。结果是“不一致”,则拒绝写入,返回存储失败。


这样CAS协议就用了“版本号”的思想,解决了冲突问题。

Memcached的CAS程序实例
1. 非CAS

首先看一个不是CAS的Memcached程序实例。实例的问题原型,见上一篇博文。

程序实例:
package com.sinosuperman.memcached;    
    
import java.io.IOException;    
import java.net.InetSocketAddress;    
    
import net.spy.memcached.MemcachedClient;    
    
public class Test {    
    public static void main(String[] args) throws IOException {    
        MemcachedClient cache = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));    
            
        cache.set("x", 1800, "Love");    
    
        String obj1 = (String) cache.get("x");    
        String obj2 = (String) cache.get("x");    
        obj2 = "Michael";    
            
        cache.set("x", 1800, obj2);    
        System.out.println("Non-CAS 2:\t" + obj2);    
        System.out.println("Non-CAS 1:\t" + obj1);    
    }    
}    

运行结果:
2011-12-18 23:12:39.836 INFO net.spy.memcached.MemcachedConnection:  Added {QA sa=/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue  
2011-12-18 23:12:39.843 INFO net.spy.memcached.MemcachedConnection:  Connection state changed for sun.nio.ch.SelectionKeyImpl@b09e89  
Non-CAS 2:  Michael  
Non-CAS 1:  Love  

可见在多个Client操作时,一定会引起写不一致性的问题。
2. CAS

程序实例:
package com.sinosuperman.memcached;    
    
import java.io.IOException;    
import java.net.InetSocketAddress;    
    
import net.spy.memcached.CASValue;    
import net.spy.memcached.MemcachedClient;    
    
public class Test {    
    @SuppressWarnings("unchecked")    
    public static void main(String[] args) throws IOException {    
        MemcachedClient cache = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));    
            
        cache.set("y", 1800, "Love");    
    
        CASValue casValue1 = cache.gets("y");    
        CASValue casValue2 = cache.gets("y");    
        cache.cas("y", casValue2.getCas(), casValue2.getValue());    
            
        System.out.println("CAS 2:\t" + casValue2.getCas());    
        System.out.println("Value 2:\t" + casValue2.getValue());    
            
        System.out.println("CAS 1:\t" + casValue1.getCas());    
        System.out.println("Value 1:\t" + casValue1.getValue());    
    }    
}   

运行结果:
2011-12-18 23:07:14.528 INFO net.spy.memcached.MemcachedConnection:  Added {QA sa=/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue  
2011-12-18 23:07:14.541 INFO net.spy.memcached.MemcachedConnection:  Connection state changed for sun.nio.ch.SelectionKeyImpl@1621e42  
CAS 2:  11  
Value 2:    Love  
CAS 1:  11  
Value 1:    Love  
分享到:
评论

相关推荐

    tomcat8 + nginx + memcached + cas 实现负载均衡的配置包

    <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.MemCacheTicketRegistry"> <constructor-arg index="0"> <bean class="net.spy.memcached.spring.MemcachedClientFactoryBean" p:servers=...

    cas-client-support-distributed-memcached-3.2.0.jar

    cas-client-support-distributed-memcached-3.2.0.jar

    Memcached CAS 命令

    Memcached CAS(Check-And-Set 或 Compare-And-Swap)命令是分布式内存缓存系统Memcached中的一个重要特性,主要用于确保并发环境下的数据一致性。在多客户端共享同一个数据存储时,CAS命令允许客户端以原子的方式...

    Memcached java的使用实例

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

    Memcached使用--使用

    2. **操作接口**:客户端库提供了基本的`get`、`set`、`delete`、`incr`(自增)、`decr`(自减)等操作,以及`cas`(检查并设置)用于实现线程安全的更新。 **四、使用示例** 在PHP中使用Memcached: ```php // ...

    memcached源代码下载.rar

    - **命令处理**:`memcached`支持GET、SET、DELETE等基本操作,以及CAS(Check and Set)操作,确保数据一致性。 **4. EnyimMemcached** `EnyimMemcached-11226.zip`是一个.NET客户端库,用于与`memcached`服务器...

    memcached和redis比较

    - **Memcached** 使用CAS(Compare-And-Swap)机制来确保数据的一致性,当多个客户端尝试同时更新同一项数据时,CAS可以确保只有一个客户端的更新会被成功提交,从而避免了数据冲突的问题。 - **Redis** 支持简单的...

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

    1. **spymemcached** 是一个流行的Java客户端,它的使用方法如下: - 首先,添加依赖到项目: ```xml <groupId>net.spy</groupId> <artifactId>spymemcached <version>2.12.3 ``` - 初始化客户端: ```...

    java连接memcached示例代码

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

    MemcachedDemo----分布式缓存系统C#应用实例

    此外,Memcached支持多种操作,如删除缓存项(`Delete`方法)、检查是否存在(`GetCas`方法配合` Cas`操作)以及批量操作(`AddBulk`、`SetBulk`等)。你还可以设置自定义的过期时间,或者使用`Slabs`机制来管理内存...

    php实现的memcached队列类

    在PHP编程环境中,Memcached是一...此外,对于并发控制,还需要了解如锁机制(如Memcached本身的CAS操作)来确保数据的一致性和完整性。总之,这个PHP Memcached队列类为构建高性能、高并发的Web应用提供了有力的支持。

    Memcached Redis MongoDB对比

    Memcached在并发场景下使用CAS(Compare And Swap)操作保证数据一致性。Redis的事务支持较弱,其仅保证事务中的每个操作连续执行。MongoDB不支持事务,但可以利用单个文档的原子操作保证数据的一致性。 数据分析:...

    memcached-1.5.3.tar.gz

    7. **CAS(Check-and-Set)机制**:提供了乐观锁功能,保证了数据的一致性。 **安装与配置memcached-1.5.3**: 1. 首先,解压下载的`memcached-1.5.3`压缩包,通常使用`tar -zxvf memcached-1.5.3.tar.gz`命令。 2....

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

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

    memcached缓存很全的文档及说明

    此外,还支持多键操作如`gets`(获取键的同时校验CAS值,用于防止并发问题)。 **4. 分布式存储与一致性哈希** Memcached的分布式特性源于客户端的分发策略,其中最常见的是一致性哈希算法。该算法通过计算哈希值...

    Memcached源码剖析笔记

    - `gets`:获取键对应的值及其CAS值(用于处理并发更新问题)。 ##### 删除命令 - `delete`:删除指定的键值对。 ##### 高级命令 - `incr`/`decr`:对指定键对应的数值型值进行增加或减少操作。 - `flush_all`:...

    memcached-1.2.1-win32.rar

    - Memcached基于键值对存储,客户端将数据以键值对的形式发送到服务器,服务器负责存储并返回一个唯一的标识(称为CAS,Check and Set),用于乐观锁操作。 3. **分布式特性** - 数据分布是基于一致性哈希,使得...

Global site tag (gtag.js) - Google Analytics