Redis事务

1、什么是Redis的事务

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

2、Redis事务能干什么

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

3、Redis事务用法

  1、开启事务

    multi

  2、执行事务

    exec

  3、放弃事务

    discard

  4、全体连坐(一个死,这一片全死)(过程中就异常)

    运行的时候,就出错,没有正常的入队。就都不执行

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 k2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> setset k3
(error) ERR unknown command 'setset'
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k5
(nil)
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> set k1 a
OK

  5、冤有头在有主(过程中没有y异常)

    运行的时候不出错,就能后面的继续运行

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> set k1 555
QUEUED
127.0.0.1:6379> set k3 33
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> get k4
QUEUED
127.0.0.1:6379> EXEC
1) (error) ERR value is not an integer or out of range
2) OK
3) OK
4) OK
5) "v4"
127.0.0.1:6379> get k4
"v4"

  6、watch监控

    6.1、悲观锁/乐观所/CAS(Check And Set)

      悲观锁(表锁):我对事情的发展很悲观,这个事情肯定出事,我把整个表都给你锁了。

      乐观锁(行锁):我对事情的发展很乐观,不上锁住。为了高并发,在每个行后面加个Version,会坚持版本号,然后更新

127.0.0.1:6379> set balance 100
OK
127.0.0.1:6379> set debt 0
OK
127.0.0.1:6379> watch balance
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> DECRBY balance 20
QUEUED
127.0.0.1:6379> INCRBY debt 20
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 80
2) (integer) 20

      CAS :

      unwatch : 与前面的watch连用,构成完整的事务。通过watch命令在事务执行之前监控多个keys,倘若watch之后又任何key的值发生了变化,exec命令执行的事务都将被放弃,同时返回Nullmutil-bulk应答以通知调用事务者执行事务失败

 

127.0.0.1:6379> WATCH k1
OK
127.0.0.1:6379> set k1 500
OK
127.0.0.1:6379> UNWATCH
OK
127.0.0.1:6379> WATCH k1
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 80
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get k1
"500"
127.0.0.1:6379> get k1
"80"

 

4、Redis事务三阶段

  1、开启:以Multi开始一个事务

  2、入队:将多个命令入队到事务中,这些命令并不会执行,而是被放在队列中

  3、执行:有exec明林出发事务执行

 

5、Redis事务特性

  1、单独的隔离操作:事务序列化,顺序执行(各自拍好队执行)

  2、没有隔离级别的概念:不是传统的DBMS,这里是NoSql

  3、不保证原子性:部分支持事务(冤有头债有主)

    

    

    

posted @ 2019-07-31 21:23  编程小白1024  阅读(241)  评论(0编辑  收藏  举报