Redis 中的事务+锁

来源:互联网 发布:汉译英好用的翻译软件 编辑:程序博客网 时间:2024/05/21 18:43

Redis 中的事务

Mysql与redis的区别

         Mysql                      Redis开启  start transaction              muitl语句  普通sql                        普通命令失败  rollback 回滚                  discard 取消成功  commit                        exec
127.0.0.1:6379> set num1 200OK127.0.0.1:6379> set num2 400OK127.0.0.1:6379> multiOK127.0.0.1:6379> decrby num2 100--将语句保存在队列queued中,不执行,只有exec才从队列中拿出来执行QUEUED127.0.0.1:6379> incrby num1 100QUEUED127.0.0.1:6379> exec1) (integer) 3002) (integer) 300

注意:
1 rollback与discard 的区别
如果已经成功执行了1条语句, 第2条语句出错.
Rollback后,前1条的语句影响消失,
Discard只是结束本次事务,前1条语句造成的影响仍然还在

127.0.0.1:6379> set num1 200OK127.0.0.1:6379> set num2 400OK127.0.0.1:6379> multiOK127.0.0.1:6379> incrby num1 100QUEUED127.0.0.1:6379> decrby num2 aaQUEUED127.0.0.1:6379> exec1) (integer) 3002) (error) ERR value is not an integer or out of range127.0.0.1:6379> get num1"300"127.0.0.1:6379> get num2"400"127.0.0.1:6379> 

2 在mutil后面的语句中, 语句出错可能有2种情况
1: 语法就有问题,
执行exec时,报错, 所有语句得不到执行

127.0.0.1:6379> set num1 200OK127.0.0.1:6379> set num2 400OK127.0.0.1:6379> multiOK127.0.0.1:6379> incrby num1 100QUEUED127.0.0.1:6379> asdad(error) ERR unknown command 'asdad'127.0.0.1:6379> exec(error) EXECABORT Transaction discarded because of previous errors.127.0.0.1:6379> get num1"200"127.0.0.1:6379> get num2"400"

2: 语法本身没错,但适用对象有问题. 比如set num2 40;decrby num2 aa
Exec之后,会执行正确的语句,并跳过有不适当的语句.

127.0.0.1:6379> set num1 200OK127.0.0.1:6379> set num2 400OK127.0.0.1:6379> multiOK127.0.0.1:6379> incrby num1 100QUEUED127.0.0.1:6379> decrby num2 aaQUEUED127.0.0.1:6379> exec1) (integer) 3002) (error) ERR value is not an integer or out of range127.0.0.1:6379> get num1"300"127.0.0.1:6379> get num2"400"127.0.0.1:6379> 


Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.有改动,执行的事务就不成功。
语法
watch key1 key2 …

案列买票

--当前票数为1127.0.0.1:6379> set ticket 1OK--用户A的钱500127.0.0.1:6379> set money 500OK--设置锁,如果票数发生变化,下面的事务不执行127.0.0.1:6379> watch ticketOK127.0.0.1:6379> multiOK127.0.0.1:6379> decr ticketQUEUED127.0.0.1:6379> decrby money 100QUEUED--在exec之前,另一个用户B购买了票数,之后当前用户A执行exec127.0.0.1:6379> exec(nil)--表示用户A的事务没有生效

另一个用户B,在用户A exec之前,先买了票

127.0.0.1:6379> decr ticket(integer) 0127.0.0.1:6379> 
原创粉丝点击