Memcached CAS详解

什么是cas

Memcached于1.2.4版本新增CAS协议,类同于Java并发包中CAS(Compare and Set)原子操作,用来处理同一item被多个线程更改过程的并发问题.

基本原理

基本原理非常简单,简而言之就是”版本号”.每个存储的数据对象都有一个版本号.在Memcached中,每个key关联有一个64bit长度的long型唯一数值,表示该key对应value的版本号.
这个数值由Memcached产生,从1开始,且同一Memcached不会重复,在两种情况下这个版本数值会加,即新增与更新,而删除item版本值不会减小.

未使用cas协议

  1. A取出数据对象x保存至本地
  2. B取出数据对象x保存至本地
  3. B修改x为数据对象y,并将其放入缓存
  4. A修改x为数据对象z,并将其放入缓存
  5. B想取回对象,发现不是y而是z,此处会发生数据写入冲突.

使用cas协议

  1. A取出数据对象x,并获取到CAS-ID
  2. B取出数据对象x,并获取到CAS-ID
  3. B修改数据对象y,在写入缓存前,发现CAS-ID与缓存空间中该数据的CAS-ID是一致,就将修改后的带有CAS-ID2的y写入到缓存.
  4. A修改数据对象z,在写入缓存前,发现CAS-ID与缓存空间中该数据的CAS-ID2不一致,则拒绝写入,返回存储失败.

示例代码

这里我们没有使用常用的spymemcached,而是使用更稳定,性能更好的java-memcached-client

当然,默认情况下如果出现写入冲突,memcached是不会将最后的值写入,所以如果需要保证强一致性,还是需要使用do while循环,保证最后的值一定被更新至memcached中.

发表评论(沙发空缺中,还不快抢~)

设置头像

*

:wink: :twisted: :smile: :sleep: :shock: :sad: :roll: :razz: :oops: :neutral: :mad: :grin: :evil: :eek: :cry: :cool: