转至博客:
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
分享到:
相关推荐
<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
Memcached CAS(Check-And-Set 或 Compare-And-Swap)命令是分布式内存缓存系统Memcached中的一个重要特性,主要用于确保并发环境下的数据一致性。在多客户端共享同一个数据存储时,CAS命令允许客户端以原子的方式...
为了实现更高效、安全的缓存策略,你可以进一步研究Memcached的特性,如CAS(Compare and Swap)操作、持久化、分布式哈希等。同时,了解如何在大型分布式系统中优化Memcached的配置和使用,以充分发挥其性能优势,...
2. **操作接口**:客户端库提供了基本的`get`、`set`、`delete`、`incr`(自增)、`decr`(自减)等操作,以及`cas`(检查并设置)用于实现线程安全的更新。 **四、使用示例** 在PHP中使用Memcached: ```php // ...
- **命令处理**:`memcached`支持GET、SET、DELETE等基本操作,以及CAS(Check and Set)操作,确保数据一致性。 **4. EnyimMemcached** `EnyimMemcached-11226.zip`是一个.NET客户端库,用于与`memcached`服务器...
- **Memcached** 使用CAS(Compare-And-Swap)机制来确保数据的一致性,当多个客户端尝试同时更新同一项数据时,CAS可以确保只有一个客户端的更新会被成功提交,从而避免了数据冲突的问题。 - **Redis** 支持简单的...
1. **spymemcached** 是一个流行的Java客户端,它的使用方法如下: - 首先,添加依赖到项目: ```xml <groupId>net.spy</groupId> <artifactId>spymemcached <version>2.12.3 ``` - 初始化客户端: ```...
此外,对于大量数据操作,可以使用批量操作接口,如`append`、`prepend`、`cas`(比较并交换)等。 为了提高性能,Memcached采用了一种称为 slab 分配的内存管理机制,将内存分割成预定义大小的块,以避免内存碎片...
此外,Memcached支持多种操作,如删除缓存项(`Delete`方法)、检查是否存在(`GetCas`方法配合` Cas`操作)以及批量操作(`AddBulk`、`SetBulk`等)。你还可以设置自定义的过期时间,或者使用`Slabs`机制来管理内存...
在PHP编程环境中,Memcached是一...此外,对于并发控制,还需要了解如锁机制(如Memcached本身的CAS操作)来确保数据的一致性和完整性。总之,这个PHP Memcached队列类为构建高性能、高并发的Web应用提供了有力的支持。
Memcached在并发场景下使用CAS(Compare And Swap)操作保证数据一致性。Redis的事务支持较弱,其仅保证事务中的每个操作连续执行。MongoDB不支持事务,但可以利用单个文档的原子操作保证数据的一致性。 数据分析:...
7. **CAS(Check-and-Set)机制**:提供了乐观锁功能,保证了数据的一致性。 **安装与配置memcached-1.5.3**: 1. 首先,解压下载的`memcached-1.5.3`压缩包,通常使用`tar -zxvf memcached-1.5.3.tar.gz`命令。 2....
- **缓存一致性**:在分布式环境中,需要考虑缓存与数据库的一致性问题,如使用缓存失效策略或更新时的CAS(Compare and Swap)操作。 - **监控与维护**:定期监控Memcached的性能指标,如命中率、内存使用情况,...
此外,还支持多键操作如`gets`(获取键的同时校验CAS值,用于防止并发问题)。 **4. 分布式存储与一致性哈希** Memcached的分布式特性源于客户端的分发策略,其中最常见的是一致性哈希算法。该算法通过计算哈希值...
- `gets`:获取键对应的值及其CAS值(用于处理并发更新问题)。 ##### 删除命令 - `delete`:删除指定的键值对。 ##### 高级命令 - `incr`/`decr`:对指定键对应的数值型值进行增加或减少操作。 - `flush_all`:...
- Memcached基于键值对存储,客户端将数据以键值对的形式发送到服务器,服务器负责存储并返回一个唯一的标识(称为CAS,Check and Set),用于乐观锁操作。 3. **分布式特性** - 数据分布是基于一致性哈希,使得...