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