Redis事务

来源:互联网 发布:php forreach 编辑:程序博客网 时间:2024/06/06 00:55

什么是Redis事务

Redis事务就是一次可以执行多个命令,本质是一系列命令的集合,一个事务中,所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞。

能做什么

一个队列中,一次性的,顺序的,排他性的执行一系列命令。

怎么使用Redis事务

  • 常用命令
DISCARD //取消事务,放弃执行事务块内的所有命令EXEC //执行事务块内的所有命令MULTI //标记一个事务块的开始UNWATCH //取消WATCH命令对所有key的监视WATCH key [key....] //监视一个(或多个)key,如果事务执行之前,这个key被其他命令改动,那么将会打断该事务
  • 正常执行
->MULTI->set k1 v1->set k2 v2->set k3 v3->get k2->EXEC
  • 放弃事务

    当中途不想执行命令时,使用DISCARD命令,放弃事务执行。

->MULTI->set k1 v1->set k2 v2->set k3 v3->get k2->DISCARD
  1. 全体连坐

    当一条命令加入队列失败的时候,所有命令都无法正常执行。该事务无效。

  2. 冤头债主
    当一条命令加入队列成功,但是执行失败的时候,只有错误执行的那条命令失败,其他的正常执行。

  3. watch监控
    1.乐观锁、悲观锁、CAS(check and set)
    2.案例,信用卡余额和欠款
    2.1无加塞更新余额和欠款
    2.2有加塞更新余额和欠款
    3.unwatch
    4.执行exec后,watch加的监控锁就会取消
    5.总结:watch指令,类似乐观锁,事务提交时,如果key的值已经被别的客户端改变,比如list已经被pop/push过了,整个事务队列就不会执行;如果whtch监控了多个key,如果在事务执行过程中有key被修改过,exec的时候会报错,整个事务执行失败。

    Redis事务的三个阶段

    • 开启:multi命令开启事务。
    • 入队:将多个命令加入到事务队列中,但是不会立即执行,等到exec命令时开始依次执行。
    • 执行:由exec命令触发事务

Redis事务的三个特性

  • 单独的隔离操作:事务中所有命令都会序列化,按顺序执行,事务在执行过程中,不会被其他客户端发来的命令请求打断。
  • 没有隔离级别的概念:队列中的所有命令没有提交之前都不会被执行,因为事务提交前,任何命令都不会被实际执行,也就不存在“事务内的查询要看到事务内的更新,在事务外不能看到”这种问题。
  • 不保证原子性:Redis事务中,如果有一条命令执行失败(冤头债主),其他命令会继续执行,不存在回滚操作。