原始标题: Redis事务支持
Redis事务支持
Redis中与事务相关的命令包括MULTI、EXEC、DISCARD、WATCH和UNWATCH。
Redis事务保证原子性。 所有命令都会执行,或者不是所有命令都会正常执行。 或者不执行
事务以MULTI开始,以EXEC或DISCARD结束。 例如:
原子删除多个key :
(版本3.2.5 )
Redis对MULTI后面的多个命令进行排队,等待EXEC时按顺序执行队列中的命令,执行事务中的命令时不处理来自其他客户端的请求。
事务错误有两种情况。
命令不排队。 因此,在运行EXEC之前可以知道这个错误。 正常排队时会返回“QUEUED”。 在什么情况下,会发生无法排队的情况? 例如,错误的命令、命令参数不匹配、Redis服务器的内存不足等
在2.6.5版之前,客户端必须手动检查所有命令是否入队成功,客户端才能识别第一个错误。 (如果没有返回QUEUED或入队发送错误,则只需调用DISCARD来结束事务,否则会导致某些命令执行成功,而某些命令执行失败。 例如:
(版本2.4.5 )
上面的事务有两条指令,第二条是由于语法错误导致入队失败。 调用exec时,redis会执行队列中的指令,即incr k1,因为它不知道存在入队失败的指令。 因此,对客户端来说会产生矛盾。
从2.6.5版开始,不需要自己检查所有命令是否入队成功。 Redis会自己记录命令是否入队失败,如果失败,在调用EXEC时会返回错误。 此时,调用DISCARD结束事务即可
同样的例子:
(版本3.2.5 )
与2.4.5版不同,调用exec时,redis不会执行事务的命令并返回错误
指令本身如语法所示,但在执行过程中会发生错误。 也就是说,在EXEC调用后发生错误。 例如,incr非数值型的key
演示:
(版本2.6.5 )
(版本3.2.5 )
我们可以看到这种情况。 所有版本都是相同的,但会导致某些命令执行成功,而某些命令执行失败。 这意味着Redis事务没有回滚概念。 (__-),官方怎么解释这个? 参照文章的末尾。
WATCH和UNWATCH命令
redis的watch实现乐观锁定的效果,在watch中实现incr :
Redis代码:
我的钥匙
val=GET mykey
val=val 1
多重
设置我的钥匙$ val
执行
如果在事务执行过程中另一个客户端更改了mykey的值,则事务将失败。 这类似于cas操作。 通过在客户端组成循环,可以实现加1的操作
在以下情况下,调用UNWATCH而不显示:
调用exec或discard时,所有已watched的密钥都将处于unwatched状态。
如果connection断开连接,则该connection上的所有watched key都将处于unwatched状态
whyredisdoesnotsupportrollbacks?
ifyouhavearelationaldatabasesbackground,thefactthatrediscommandscanfailduringatransaction,butstillrediswilexecutetthereston
howevertherearegoodopinionsforthisbehavior :
rediscommandscanfailonlyifcalledwithawrongsyntax (andtheproblemisnotdetectableduringthecommandqueueueing )、 oragainstkeysholdingthewrongdatatype : thismeansthatinpracticaltermsafailingcommandistheresultofaprogrammingerrors, andakindoferrorthatisverylikelytobedetectedduringdevelopment,and not in production。
redisisinternallysimplifiedandfasterbecauseitdoesnotneedtheabilitytorollback。
anargumentagainstredispointofviewisthatbugshappen、 howeveritshouldbenotedthatingeneraltherollbackdoesnotsaveyoufromprogrammingerrors.forinstanceifaqueryincrementsakeyby2inst eakeyby 2 or increments the wrong key,thereisnowayforarollbackmechanismtohelp.giventhatnoonecansavetheprogrammerfromhisorhererrrors, andthatthekindoferrorsrequiredforarediscommandtofailareunlikelytoenterinproduction,weselectedthesimplerandfasterapproapraproachoachofnthofndored
我个人认为这个解释是不可能的。 程序员犯两个人是很正常的。 在一个事务的中途弄错一个命令的话,就会出现不一致的情况。 这让比价很尴尬,所以我不知道这个事务可以在哪里使用。 向路过的伟大的人请示
关注JAVA思考者
查看更多关于Java技术的精选文章
责任编辑: