memcached cas我理解不了 我就只知道在高并发情况下不会出问题

a6965921

我百度就看到
如果不采用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是否一致。结果是“不一致”,则拒绝写入,返回存储失败。

完全看不懂

3695 3 0
3个回答

walkor

你贴的讲解已经很详细了,意思就是替换存储中数据时,判断下里面的数据是不是被其它进程改变了,如果改变了就不能存(不然会导致数据丢失等不一至的情况),需要重新读取存储中新的值,然后重新计算存储中应该存储的值,然后再去存储。

例如聊天列表,现在有 三个用户
1、E用户登录,读取列表,此时E认为当前用户列表应该更新成
2、E用户登录的同时F用户也登录,在E用户没存入用户列表前,F用户读取的当前用户列表也是,F用户认为当前用户列表应该更新为
3、这时E用户存入了用户列表中,存储中是
4、这时F也要更新用户列表中,F认为户列表应更新为(这时不知道里面的列表已经不是),如果这时它没判断存储中的值是否被改变过就存进去了,那么会导致E用户的数据丢失

cas_id可以看成存储中的md5值,存储中的数据每次变化md5(cas_id)值都会变化,从存储中读取数据的同时获得这个md5(cas_id),等到更新时提供这个md5(cas_id)让memcache判断能否更新存储中的数据。如果memcache发现当前存储中的数据的md5(cas_id)不是客户端提供的md5(cas_id),就不更新返回false

希望这样讲你能理解

  • 暂无评论
a6965921

意思就是替换存储中数据时,判断下里面的数据是不是被其它进程改变了,如果改变了就不能存(不然会导致数据丢失等不一至的情况),需要重新读取存储中新的值,然后重新计算存储中应该存储的值,然后再去存储。 这个就说的很清楚啦 哈哈

  • 暂无评论
walkor

对,就是这个意思

  • 暂无评论
年代过于久远,无法发表回答
🔝