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、不保证原子性:部分支持事务(冤有头债有主)