新版本的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信息