redis事务及锁应用
redis支持简单的事务
Redis与mysql事务的对比
redis | mysql | |
开启 | multi | start transaction |
语句 | 普通命令 | 普通sql |
失败 | Discard取消 | Rollback回滚 |
成功 | exec | Commit |
注:rollback与discard的区别
如果已经成功执行了2条语句,第3条语句出错
Rollback后,前2条的语句影响消失。
Discard只是结束本次事务,前2条语句造成的影响仍然还在
注:
multi后面的语句都会放入一个队列中,exec后再执行;
在multi后面的语句中,语句出现错误可能有2种情况
1、语法有问题:
这种情况下exec时,所有的语句都得不到执行
2、语法本身没错,但是适用对象有问题,比如sadd操作link对象,
exec之后,会执行正确的语句,并且跳过有不适当的语句
(如果sadd操作link这种事应该怎么避免?这一点只能由程序员负责)
思考:
我正在买票
Ticket-1,money-100
而票只有1张,如果在我multi之后和exec之前,票被别人买了---- 即ticket=0
我该如何观察这种情况,并不在提交
悲观的想法:
世界充满危险,肯定有人和我抢,给ticket上锁,只有我能操作。(悲观锁)
乐观的想法:
没有那么多的人和我抢,因此,我只需要注意---没有人更改ticket的值就可以了(乐观锁)
Redis的事务中,启用的就是乐观锁,只负责检测可key有没有被修改。
Watch key1 key2....keyN
作用:监听key1 key2..... keyN有没有发生变化,如果有变,则事务取消(任意一个发生变化,事务都取消)
Unwatch
作用:取消所有watch监听