0
点赞
收藏
分享

微信扫一扫

Redis学习12:事务


Redis学习12:事务_redis

事务

  • 就是一个命令执行的队列,将一系列预定命令包装成一个整体(一个队列)。执行的时候,依次按照添加顺序依次执行,中间不会被打断或者干扰。

事务的基本操作

Redis学习12:事务_客户端_02

  • 就是将从multi开始的后面的命令加到队列中,不执行,等遇到exec时,开始执行队列命令。
  • 输入multi代表开始。
  • 然后后面输入的命令会返回queued。
  • 然后输入exec。
  • 然后开始输出队列中每个任务的结果。
  • 如下图。
  • 如果事务有问题,那么通过一个命令来取消。
  • 命令:discard
  • 类似回滚。

事务的工作流程

Redis学习12:事务_回滚_03

  • discard是直接销毁这个队列,而exec是执行完队列中的事务才销毁队列的。

错误命令

Redis学习12:事务_数据库_04

  • 如果定义的过程中,有命令错误,那么这个队列就会没有了。

Redis学习12:事务_数据库_05


Redis学习12:事务_客户端_06

  • 已经执行完的命令不会回滚的,程序员需要自己在代码中实现回滚的!

事务:锁

Redis学习12:事务_数据库_07

Redis学习12:事务_php_08

  • 也就是说可以对key增加一个监控,也就是锁。如果执行exec前key发生变化了,那么就不执行操作了。
  • watch 和 定义事务之间是可以 进行其他操作的。

Redis学习12:事务_客户端_09


在执行exec前,通过另一个客户端 set name 修改name的值,然后再回车exec,就会返回nil。也就是执行不了了。

  • 同时需要注意的是,在事务里面不能执行watch。
  • unwatch 就是取消监控。

分布式锁

Redis学习12:事务_redis_10


Redis学习12:事务_客户端_11

  • 监控的是数据,数据会改变的,而不是监控别人能不能改这个值,所以应该用分布式锁。

Redis学习12:事务_客户端_12

  • 也就是说,当前的人使用的时候,锁会使得别人不能使用。
  • 操作完毕再用del删掉就可以了。

Redis学习12:事务_redis_13

  • 类似同步锁,那么就是对于多客户端就可以使得别人操作不了。
  • 但是这个方案是一个设计概念,有风险性。

Redis学习12:事务_数据库_14

  • 因为锁是客户自己加的,也是他自己删掉的,那么如果客户端忘记了解锁,那么风险就很大了。

Redis学习12:事务_redis_15

  • 那么可以设置一些后手,就是加时效,这样到点不释放,就可以直接释放掉这个锁了。

Redis学习12:事务_数据库_16


Redis学习12:事务_redis_17


举报

相关推荐

0 条评论