博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis 中的事务
阅读量:5891 次
发布时间:2019-06-19

本文共 2047 字,大约阅读时间需要 6 分钟。

Redis支持简单的事务

Redis与 mysql事务的对比

 

 

Mysql

Redis

开启

start transaction

multi

语句

普通sql

普通命令

失败

rollback 回滚

discard 取消(不叫回滚,是队列里面的命令不执行,队列里面的任务根本就没有执行。而不是执行了也可以撤回来)

成功

commit

exec

注: rollback与discard 的区别如果已经成功执行了2条语句, 第3条语句出错.Rollback后,前2条的语句影响消失.Discard只是结束本次事务,前2条语句造成的影响仍然还在。严格来讲不叫回滚,只是叫取消。Redis的事务相对要简单。r1:2>set wang 100"OK"r1:2>set zhao 100"OK"r1:2>multi"OK"r1:2>decrby zhao 100"QUEUED"     //减100并没有执行,而是加入到了队列中,redis是单进程的,exec的时候就回去执行队列里面的语句r1:2>incrby wang 100"QUEUED"r1:2>get wang"QUEUED"r1:2>get zhao"QUEUED"r1:2>exec
注:在mutil后面的语句中, 语句出错可能有2种情况1: 语法就有问题, 这种,exec时,报错, 所有语句得不到执行r1:2>multi"OK"r1:2>decrby zhao 100"QUEUED"r1:2>sdsv "ERR unknown command 'sdsv'"r1:2>exec"EXECABORT Transaction discarded because of previous errors."   //事务取消了,zhao没有减1002: 语法本身没错,但适用对象有问题. 比如 zadd 操作list对象Exec之后,会执行正确的语句,并跳过有不适当的语句.r1:2>multi"OK"r1:2>decrby zhao 100"QUEUED"r1:2>sadd wang pig    //wang是一个字符串,这里当成是集合在处理"QUEUED"   //放在队列里面,命令尚没有执行,r1:2>exec1) "0"        //zhao的钱变为了02) "WRONGTYPE Operation against a key holding the wrong kind of value"     //第二个语句执行出错(如果zadd操作list这种事怎么避免? 这一点,由程序员负责)Multi是把命令放在一个队列里面,exec是真正的执行,语法错误则都不执行,语法没错但是适用对象有错则执行正确的语句跳过错误的语句。这就没法保证原子性。r1:2>multi"OK"r1:2>decrby zhao 100"QUEUED"r1:2>decrby wang 100"QUEUED"r1:2>discard    //取消,就是清空队列,就不会执行了"OK"r1:2>mget zhao wang1) "100"2) "100"
思考: 我正在买票Ticket -1 , money -100而票只有1张, 如果在我multi之后,和exec之前, 票被别人买了---即ticket变成0了.我该如何观察这种情景,并不再提交悲观的想法: 世界充满危险,肯定有人和我抢, 给 ticket上锁, 只有我能操作. [悲观锁]乐观的想法:没有那么人和我抢,因此,我只需要注意,--有没有人更改ticket的值就可以了 [乐观锁]Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.具体的命令----  watch命令例: redis 127.0.0.1:6379> watch ticketOKredis 127.0.0.1:6379> multiOKredis 127.0.0.1:6379> decr ticketQUEUEDredis 127.0.0.1:6379> decrby money 100QUEUED//现在已经对ticket进行了监控,另外一个窗口将ticket改动了另一个窗口:> decr ticket    redis 127.0.0.1:6379> exec(nil)   // 返回nil,说明监视的ticket已经改动了,事务就取消了.队列就不执行了。redis 127.0.0.1:6379>mget ticket money"0""200"watch key1 key2  ... keyN作用:监听key1 key2..keyN有没有变化,如果任意一个有变, 则事务取消unwatch 作用: 取消所有watch监听

 

本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/8276819.html,如需转载请自行联系原作者

你可能感兴趣的文章
Android 手机上获取物理唯一标识码[转]
查看>>
软件的增量更新
查看>>
robotframework关于To Json问题
查看>>
Android ellipsize的几种属性值介绍
查看>>
[Silverlight]关于对Canvas.ZIndex的认识误区
查看>>
uva 11538
查看>>
weblogic部署项目报错
查看>>
[转载]WebSocket
查看>>
【转载】 Asp.net Mvc 3当然也不会例
查看>>
容器相关概念
查看>>
day28-python阶段性复习-基础二
查看>>
16-angular.isFunction
查看>>
java前后向查找个人理解
查看>>
.net/MVC 中Json 的使用(一)
查看>>
ubuntu18.04-换源
查看>>
iOS分组通讯录效果+側滑菜单(MMDrawerController)
查看>>
鼠标放上图片变大特效
查看>>
三十道linux内核面试题
查看>>
MySql 存储过程
查看>>
用Hexo搭建属于自己的Blog
查看>>