乐观锁(又名乐观并发控制,Optimistic Concurrency Control,缩写“OCC”),是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。

与乐观所相对的,就是悲观锁(又名悲观并发控制,Pessimistic Concurrency Control,缩写“PCC”),它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作都某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。

通俗的说,就是悲观锁就是“先取锁在访问”,因为悲观锁会“悲观”地认为访问会产生冲突,因此这种保守的策略虽然在数据处理的安全行上提供了保障,但是在效率方面会让数据库产生极大的开销,而且还有可能出现死锁的情况。

RedisWATCH命令的实现是基于乐观锁,即,假设访问不会产生冲突,但是在提交数据之前会先检查该事务该事物读取数据后,其他事务是否修改数据,如果其他事务修改了数据,像MySQL提供了回滚操作,而Redis不支持回滚,因为antirez认为这与Redis简单高效的设计主旨不相符,并且Redis事务执行时错误在开发环境时是可以避免的。

乐观锁控制的事务一般包括三个阶段:

  • 读取:当执行完MULTI命令后,客户端进入事务模式,客户端接下来输入的命令会读入到事务队列中,入队过程中出错会设置CLIENT_DIRTY_EXEC标识。
  • 校验:如果数据库有键被修改,那么会检测被修改的键是否是被WATCH命令监视的命令,如果是则会设置对应的标识(CLIENT_DIRTY_CAS),并且在命令执行前会检测这两个标识,如果检测到该标识,则会取消事务的执行。
  • 写入:如果没有设置以上两种标识,那么会执行事务的命令,而Redis是单进程模型,因此可以避免执行事务命令时其他请求可能修改数据库键的可能。

Redis的乐观锁不是通常实现乐观锁的一般方法:检测版本号,而是在执行完一个写命令后,会进行检查,检查是否是被WATCH监视的键。

redis乐观锁的更多相关文章

  1. Python Redis pipeline操作和Redis乐观锁保持数据一致性

    Redis是建立在TCP协议基础上的CS架构,客户端client对redis server采取请求响应的方式交互. redis 乐观锁:也可理解为版本号比较机制,主要是说在读取数据逇时候同时读取其版本 ...

  2. redis 乐观锁实践秒杀

    需求:有一个标(理解成抢红包也行,accountBalance预赋值1000元),大家可以抢购,每个用户抢购成功后,更新最后标的总数,在并发情况下,使用redis的乐观锁,保证更新标总值正确性,先往r ...

  3. redis乐观锁(适用于秒杀系统)

    redis事务中的WATCH命令和基于CAS的乐观锁  在Redis的事务中,WATCH命令可用于提供CAS(check-and-set)功能.假设我们通过WATCH命令在事务执行之前监控了多个Key ...

  4. Redis分布式锁----乐观锁的实现,以秒杀系统为例

    本文使用redis来实现乐观锁,并以秒杀系统为实例来讲解整个过程. 乐观锁      大多数是基于数据版本(version)的记录机制实现的.即为数据增加一个版本标识,在基于数据库表的版本解决方案中, ...

  5. redis 事务(悲观锁和乐观锁)

    MULTI 开启事务,后续的命令会被加入到同一个事务中 事务中的操作会发送给客服端,但是不会立即执行,而是将操作放到了该事务对应的一个队列中,服务端返回QUEQUD EXEC 执行EXEC后,事务中的 ...

  6. Redis中的事务及乐观锁的实现

    介绍 Redis中的事务(transaction)是一组命令的集合.     事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行.     Redis事务的实现需要用 ...

  7. redis中使用 check-and-set 操作实现乐观锁

    WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为. 被 WATCH 的键会被监视,并会发觉这些键是否被改动过了. 如果有至少一个被监视的键在 EXEC 执行之前 ...

  8. php+redis 学习 三 乐观锁

    <?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 实现乐观锁机制 * * @example php ...

  9. 基于redis的乐观锁实践

    redis真是一个分布式应用场景下的好东西,对于我们的应用设计,功劳大大的! 今天要研究的是基于redis的事务机制以及watch指令(CAS)实现乐观锁的过程. 所谓乐观锁,就是利用版本号比较机制, ...

随机推荐

  1. 发布MeteoInfo 1.2.6

    增加了对AWX卫星数据格式的支持(和C#版本的功能相当).在MeteoInfo中打开AWX数据: 在MeteoInfoLab中打开AWX数据:

  2. Exists 和Not Exists使用

    描述:exists表示()内子查询语句返回结果不为空说明where条件成立就会执行主sql语句,如果为空就表示where条件不成立,sql语句就不会执行.not exists和exists相反,子查询 ...

  3. lvs搭建dr负载均衡集群

    一,查看本地centos的版本: [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) ...

  4. centos8安装php7.4

    一,下载php7.4 1,官方网站: https://www.php.net/ 2,下载 [root@yjweb source]# wget https://www.php.net/distribut ...

  5. centos8平台:用fontconfig安装及管理字体(fc-list/fc-match/fc-cache)

    一,fc-list所属的rpm包 [root@blog ~]$ whereis fc-list fc-list: /usr/bin/fc-list /usr/share/man/man1/fc-lis ...

  6. html中object标签

    首先将这个强大web页面打印例子(pintTest.html)贴上来. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional ...

  7. c++ 遍历目录下文件、文件夹

    BOOL GetDirFiles(const char* pszDir, char* pszFileType, std::vector<std::string>& vtFileLi ...

  8. elasticsearch启动报错

    1,max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] 查看 ...

  9. IDEA配置类和方法注释模板

    1定义java文件头部的注释 2给java类中的方法添加上注释 2.1第一步勾选Enable Live  Templates 2.2第二步新建一个Group 2.3第三步新建一个Template 2. ...

  10. Jenkins部署持续集成远程机节点的问题

    工作需要把工作电脑作为持续集成的执行机,最近研究Jenkins,在工作电脑上搭了一套环境,期间把原来的JDK删除掉了,导致持续集成的Jenkins节点slave-agent.jnlp打不开.解决方法是 ...