Redis 事务

Redis 事务
Redis 事务
含义:
  • 可以执行 一次 多个 命令 。(是一组命令的集合)
  • 一个事务中的所有命令都会有序列化。(按顺序的串化执行而不会被其他命令插入,不许加塞)
  • 如同 GIT commit 提交。

  • 作用:
  • 一个队列中,一次性顺序性排他性执行一系列命令。

Redis 常用的命令

DISCARD 取消失误,放弃执行事务内的所有命令

EXEC 执行事务块内的命令

MULTI 标记一个事务的开始

UNWATCH 取消Watch 命令 对所有的 key 的监控

WATCH key [key...] 监视一个或多个 key, 如果在事务执行之前这个(或这些)key 被其他命令所改动,那么事务被打断。


  • 正常执行
    • 1.标记一个事务的开始 mluti。           
             Redis 事务
  • 2. 写入执行的语句,写入的队列(queue)中。        
            Redis 事务
  • 3.执行事务 exec    
            Redis 事务

  • 放弃事务
    • 1.标记一个事务的开始 mluti。
    • 2.写入执行的语句,写入到队列(queue)中。
    • 3.执行放弃事务 discard。
               Redis 事务

  • 全体连坐
    • 1.标记一个事务的开始 mluti。
    • 2.写入执行的语句,写入到队列(queue)中。执行事务 exec,就会报错。 
      • 当执行语句中有语法错误,就会报错。
    Redis 事务                


  • 冤头债主
    • 1.标记一个事务的开始 mluti。
    • 2.写入执行的语句,写入到队列(queue)中。。
    • 3.执行事务 exec。
      • 当执行的事务中,有类型错误等逻辑错误 ,只执行对的语句。Redis 事务
  • watch 监控
    • 含义:Watch指令,类似乐观锁,事务提交时。
      • 如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行

  • 悲观锁
  • 含义: 很悲观,每次去数据库拿数据的时候都会认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿我这个数据就会block 直到它拿到锁。
  • 例如:传统的关系性数据库里边就用到了很多这种锁的机制。
    • 行锁
    • 表锁
    • 读锁
    • 写锁
  • 都是在操作之前先上锁。
  • 缺点:性能下降

  • 乐观锁
    • 含义: 对事情的发展状况表示乐观状况
    • 例如: 不锁整个表,既保证高并发,又不锁整张表。
      • 方法:在每天记录后面加一个字段 version (行锁)
    • 乐观的策略:提交的版本必须大于记录当前版本才能执行更新。

  • CAS

  • Watch 操作:
    • 1.设置 收入为100 ,支出为20, 剩余为80
                    Redis 事务
  • 2.监控 收支的情况
                    Redis 事务
                
  • 3.如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行。
  • a. B 用户 操作balance 
                            Redis 事务
  • b. A 用户操作 监控的事务操作没有被执行
                           Redis 事务                     
  • c.小结:
    • 通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败)

  • d.当发生以上情况的时候,正确的操作:       
    • 先执行放弃监控 unwatch
    • 加载 监控的对象balance 
    • 监控 ==>> 标记事务 ==>>执行语句 ==>>执行事务
                                    Redis 事务