Redis事务
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Redis事务,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2006字,纯文字阅读大概需要3分钟。
内容图文
![Redis事务](/upload/InfoBanner/zyjiaocheng/1305/412bd5033432413088216134df3f2818.jpg)
一:Redis的事务
Redis通过MULTI, EXEC, DISCARD 和 WATCH 命令来实现事务的支持,通过它们我们可以一步操作执行一组命令,而且确保了两个重要的特征如下
1.所有的命令在一个事务中可确保顺序执行,切不会被其它线程打断(插入其它指令)。
2.确保所有的命令要么全部执行要么一个也不执行。注意并不能保证每个任务都执行成功,而且失败的命令也不能回滚事务。
二:使用方法
步骤1: 开启事务 MULTI
步骤2: 执行命令 command1 command2 ....
步骤3: 执行事务 EXEC 或 DISCARD
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR foo
QUEUED
127.0.0.1:6379> INCR bar
QUEUED
127.0.0.1:6379> exec
1) (integer) 12) (integer) 1
备注:exec返回一个数组对象,数组的每个对象顺序对应每个执行的命令
三:事务的失败分析
通常一个事务的失败原因主要可分为两类
类1:命令如队(queue)失败,即在EXEC命令调用之前失败,失败的原因多为命令-参数错误,或者是内存溢出
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> incr a b c
(error) ERR wrong number of arguments for‘incr‘ command
类2:EXEC命令调用之后失败。注意一组命令其中一个命令失败,并不会影响该命令后的其它命令的执行。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set a abc
QUEUED
127.0.0.1:6379> lpop a
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
四:WATCH命令实现乐观锁
WATCH通过check-and-set (CAS) 即检查然后设置的机制来实现事务的回滚特性,即被WATCH
ed的属性在执行事务之前会检查该属性值是否被其它线程改变,如果改变事务执行失败,否则继续。
通过例子分析:有如下业务
val = GET mykey //步骤1:先获取属性值 若此时mykey的值为1
val = val + 1 //步骤2:给值加1
SET mykey $val //步骤3:重新赋值熟悉
若有2个线程同时执行以上代码,其结果mykey的值只能加1即值为2,(两个线程应该为3??)
我们可以通过WATCH命令监控mykey,即当其它或当前线程修改了mykey属性的值,事务执行失败
127.0.0.1:6379> set mykey 2
OK
127.0.0.1:6379> get mykey
"2"127.0.0.1:6379> WATCH mykey #监控mykey
OK
127.0.0.1:6379> get mykey #查看mykey
"2"127.0.0.1:6379> incr mykey #重新赋值mykey 加1
(integer) 3127.0.0.1:6379> MULTI #开启事务
OK
127.0.0.1:6379> set mykey 4 #重新赋值mykey
QUEUED
127.0.0.1:6379> exec #执行事务
(nil) #执行失败
127.0.0.1:6379> get mykey
"3"
备注:官方文档上说当前连接对watched属性操作不会影响事务,好像不是,这里有对这个疑问的讨论https://github.com/antirez/redis-doc/issues/734
备注:UNWATCH指令,顾名思义即WATCH对立指令,即停止对某个属性的监控,exec和discard指令都会调用unwatch指令,我们也可以手动调用该指令。
思考:WATCH是什么?它是EXEC命令执行的条件,即被监控的属性没有被修改过为TURE,否则为FALSE
五:Redis脚本和事务
Redis script(Redis脚本)是事务定义的,所以任何在事务中做的事情你都可以通过脚本完成,而且脚本更快和简单
参考:https://redis.io/topics/transactions
原文:https://www.cnblogs.com/jinliang374003909/p/13160879.html
内容总结
以上是互联网集市为您收集整理的Redis事务全部内容,希望文章能够帮你解决Redis事务所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。