博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MemcacheD CAS

Posted on 2010-05-27 17:28  commond  阅读(1858)  评论(0编辑  收藏  举报

新版本的spy memcacheD 中加入了CAS操作(server1.4.4/client2.5) , 何谓CAS ? 简而言之就是你必须以最新数据为基础进行修改,否则就不能更新这条数据。 看一个例子:

 

1.   A 取出对象objectA

2.   B 取出对象 objectA

3.   B 修改对象 objectA 并放入缓存

4.   A 修改对象 objectA 并放入缓存 --------冲突

在第四步, A修改的对象已经不是最新的了,所以产生了冲突。 那么memcacheD如何实现CAS?

Future<CASResponse> net.spy.memcached.MemcachedClient.asyncCAS(String key, long casId, Object value)

asyncCAS方法类似于asyncPut方法,但是要求在Put时传递一个long型的casId , server会用这个id去判断你提交的版本是否是最新的。CASValue<Object> net.spy.memcached.MemcachedClient.gets(String key)

不同于普通get方法返回的Oject , gets方法返回的是一个CASValue对象 使用CASValue的getCas()方法可以拿到这个对象的casId

这样,对应于上文的例子

 

1.   A 取出对象objectA ------ A拿到casIdA

2.   B 取出对象 objectA------ B拿到casIdA

3.   B 修改对象 objectA 并放入缓存(同时传入casIdA)------- server端比较传入的casIdA和server端保存的casId ,发现一致 ,则存储成功,并且修改server端的casId为casIdA‘

4.   A 修改对象 objectA 并放入缓存 --------server端比较传入的casIdA和server端保存的casId ,发现不一致(casIdA !=casIdA‘) ,则存储失败,返回Exist信息