redis 事物

Posted running-fly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis 事物相关的知识,希望对你有一定的参考价值。

   1.范例

multi //事物开启
普通命令 //把命令加入队列
exec //执行

 2.错误类型

       (1)语法错误

    这种,exec,报错, 所有语句都不会执行

  (2)运行错误

    这种exec时,比如 zadd 操作list对象,Exec之后,会执行正确的语句,并跳过有不适当的语句.

  3.思考:

 

  我正在买票

 

  Ticket -1 , money -100

 

  而票只有1, 如果在我multi之后,exec之前, 票被别人买了---ticket变成0.

 

  我该如何观察这种情景,并不再提交

 

 

 

  悲观的想法:

 

  世界充满危险,肯定有人和我抢, ticket上锁, 只有我能操作. [悲观锁]

 

 

 

  乐观的想法:

 

  没有那么人和我抢,因此,我只需要注意,

 

  --有没有人更改ticket的值就可以了 [乐观锁]

 

 

 

  Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.

 

 

  

 

 

 

  悲观的想法:

 

  世界充满危险,肯定有人和我抢, ticket上锁, 只有我能操作. [悲观锁]

 

 

 

  乐观的想法:

 

  没有那么人和我抢,因此,我只需要注意,

 

  --有没有人更改ticket的值就可以了 [乐观锁]

 

 

 

  Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.

  

  具体的命令----  watch命令

 

  例:

 

  redis 127.0.0.1:6379> watch ticket

 

  OK

 

  redis 127.0.0.1:6379> multi                                                   // 在事物exec之前,另一个进程decr ticket,然后事物监测到了ticket变化,在执行exec时候所有事物里面的命令都不会执行

 

  OK

 

  redis 127.0.0.1:6379> decr ticket

 

  QUEUED

 

  redis 127.0.0.1:6379> decrby money 100

 

  QUEUED

 

  redis 127.0.0.1:6379> exec

 

  (nil)   // 返回nil,说明监视的ticket已经改变了,事务就取消了.

 

  redis 127.0.0.1:6379> get ticket

 

  "0"

 

  redis 127.0.0.1:6379> get money

 

  "200"

       

 

 

  watch key1 key2  ... keyN

  作用:监听key1 key2..keyN有没有变化,如果有变, 则事务取消

 

  unwatch

  作用: 取消所有watch监听

 

        

    

 

以上是关于redis 事物的主要内容,如果未能解决你的问题,请参考以下文章

八十五:redis之redis的事物发布和订阅操作 (2019-11-18 22:54)

如何从Android中的片段单击按钮打开片段

redis事物

Redis进阶之事物&持久化

Redis事物

Redis 事物