专栏首页golang+phpMemcache CAS协议介绍及使用

Memcache CAS协议介绍及使用

1.什么是CAS

所谓CAS,check and set,在写操作时,先检查是否被别的线程修改过。 基本原理非常简单,一言以蔽之,就是“版本号”。每个存储的数据对象,多有一个版本号。我们可以从下面的例子来理解: 如果不采用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协议就用了“版本号”的思想,解决了冲突问题。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一条sql语句究竟是如何执行的

    相信做后端的同学肯定离不开一个话题,就是 mysql,大家也花式的执行过各种各样的 sql 语句,然后得到返回结果,那么一条 sql 语句执行究竟经历了哪些步骤...

    程序员养成日记
  • go语言反射

    oValue := reflect.ValueOf(obj) field := oValue.Field(i) -> fieldValue :=value.F...

    程序员养成日记
  • redis中setbit(位操作)的实际应用

    redis的五种数据类型相信大家都非常清楚了,任何人问你基本都能脱口而出(string,hash,list,set,zset)。如果还不清楚,建议先看看redi...

    程序员养成日记
  • java 中的CAS与ABA问题

    属于悲观锁,有共享资源,需要加锁时,会以独占锁的方式导致其它需要获取锁才能执行的线程挂起,等待持有锁的钱程释放锁。传统的关系型数据库里边就用到了很多这种锁机制,...

    开发架构二三事
  • 面试必备:CAS无锁机制

    通常我们提到保证多线程安全,会想到三种方式,一是使用Synchronize关键字,但是有个问题就是,使用了Synchronize加锁后的多线程相当于串行,执行效...

    niceyoo
  • Java并发之原子变量及CAS算法-下篇

    本文主要讲在Java并发编程的时候,如果保证变量的原子性,在JDK提供的类中是怎么保证变量原子性的呢?。对应Java中的包是:java.util.concurr...

    凯哥Java
  • UnicodeEncodeError:'latin-1' codec can't encode characters in position 0-1: ordinal not in range(...

    解决方法,在sql.py中,或者是链接数据库时,添加:最后增加一个 : charset="utf8" 就好了

    Python疯子
  • Git示例教程 - 同步本地分支的添加删除状态到远程(或反之)

    为了方便测试,我们先在GitHub上创建一个名为git-test-repo的仓库,然后将其克隆到本地,之后,我们再用相应的命令创建一个测试分支,并将其同步到远端...

    wangyuntao
  • 【目标检测】开源 | 解决了锚盒与轴向卷积特征之间的错位问题,在航空目标数据集(DOTA和HRSC2016)上性能SOTA!

    论文地址: http://arxiv.org/pdf/2008.09397v1.pdf

    CNNer
  • SpringBoot 系列 JPA 错误姿势之 Entity 映射

    本篇为 JPA 错误使用姿势第二篇,java 的 POJO 类与数据库表结构的映射关系,除了驼峰命名映射为下划线之外,还会有什么别的坑么?

    一灰灰blog

扫码关注云+社区

领取腾讯云代金券