是什么
可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,不许加塞!
可以一口气攒着,不需要立刻知道结果。但是一定要确保数据的准确性!分红就是这样的!
排好队,一次性的执行多个redis的命令!
能干嘛
一个队列中,一次性的、顺序性的、排他性的执行一系列的命令。要么一起成功,要么一起失败。
怎么玩
通过MULTI指令开启,之后输入多个命令!Redis将它们加入到队列当中,所有的命令通过EXEC来开启执行!
通过DISCARD来放弃本次的批处理操作!
例子:银行转账,要么成功,要么失败。
192.168.1.66:6379> MULTI
OK
192.168.1.66:6379> set k1 v1
QUEUED
192.168.1.66:6379> set k2 v2
QUEUED
192.168.1.66:6379> set k3 v3
QUEUED
192.168.1.66:6379> set k4 v4
QUEUED
192.168.1.66:6379> get k2
QUEUED
192.168.1.66:6379> EXEC
1) OK
2) OK
3) OK
4) OK
5) "v2"
好比购物先加入购物车,最后EXEC统一结账。
192.168.1.66:6379> MULTI
OK
192.168.1.66:6379> set k1 11
QUEUED
192.168.1.66:6379> set k2 22
QUEUED
192.168.1.66:6379> set k3 33
QUEUED
192.168.1.66:6379> DISCARD
OK
192.168.1.66:6379> get k1
"v1"
DISCARD 撤销所有操作!
192.168.1.66:6379> MULTI
OK
192.168.1.66:6379> set k1 v1
QUEUED
192.168.1.66:6379> set k2 v2
QUEUED
192.168.1.66:6379> getset k3
(error) ERR wrong number of arguments for 'getset' command
192.168.1.66:6379> set k4 v4
QUEUED
192.168.1.66:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
加入时只要有一个出错误,统统的不执行!
周阳语录:年轻的时候,就是练级打怪的时候,勇敢的上!挑战自己!30以前不要怕,30岁以后不要悔!有机会就跳进去干!
192.168.1.66:6379> set k1 1
OK
192.168.1.66:6379> set k2 2
OK
192.168.1.66:6379> set k3 3
OK
192.168.1.66:6379> set k4 4
OK
192.168.1.66:6379> MULTI
OK
192.168.1.66:6379> incr k1
QUEUED
192.168.1.66:6379> decr k2
QUEUED
192.168.1.66:6379> EXEC
1) (integer) 2
2) (integer) 1
192.168.1.66:6379> get k1
"2"
192.168.1.66:6379> get k2
"1"
k1增加了,k2减小了!通过事物处理,妥妥的不出错!
192.168.1.66:6379> set k1 v1
OK
192.168.1.66:6379> set k2 v2
OK
192.168.1.66:6379> set k3 v3
OK
192.168.1.66:6379> set k4 v4
OK
192.168.1.66:6379> MULTI
OK
192.168.1.66:6379> incr k1
QUEUED
192.168.1.66:6379> set k2 22
QUEUED
192.168.1.66:6379> set k3 33
QUEUED
192.168.1.66:6379> set k4 44
QUEUED
192.168.1.66:6379> get k4
QUEUED
192.168.1.66:6379> EXEC
1) (error) ERR value is not an integer or out of range
2) OK
3) OK
4) OK
5) "44"
加入队列时不出错,下面的都将正常运行,执行时出错不影响其他语句!
Watch监控 重要
悲观锁、乐观锁、CAS(check and set)
行锁,表锁,并发性与一致性的对立!表锁,并发性及其差,但是一致性非常好!
工作中,正常用乐观锁!并发性会更好!
悲观锁每次拿数据的时候都会上锁(行锁,表锁)。并发性差!
乐观锁,每次去拿数据不会上锁,但是更新的时候,使用版本号机制。判断一下在此期间别人有没有去更新这个数据。
乐观锁策略:提交版本必须大于记录当前版本才能执行更新。
一旦执行了exec之前加的监控锁都会被取消掉!
Watch指令类似于乐观锁!如果key值已经被客户端改变,整个事务队列都不会被执行!把最新的数据拿下来,再次执行!
开启,入队,执行。(事务的三个阶段)