redis-事务操作

redis事务本质上是一组命令的批处理,这组命令在执行过程中会被顺序性、一次性全部执行,只要没有出现语法错误,
这组命令在执行期间是不会被中断。
redis事务特性
redis事务仅保证了数据的一致性,不具有像数据库(例如mysql)一样的ACID特性。

  • 这组命令中的某些命令如果执行失败是不会影响其他命令的执行的,也不会回滚。即不具备原子性。
  • 这组命令可以通过乐观锁机制实现简单的隔离性。
  • 这组命令的执行结果会被写入到内存中,是否持久取决于redis的持久化策略,与事务无关。
    命令
    1.multi: 开启事务
    2.exec: 执行事务
    3.discard: 取消事务
    隔离的实现
    redis通过watch命令添加乐观锁再配合事务实现了多线程下的执行隔离。
    1.当一个客户端a对key执行了watch命令后,系统就会为该key添加一个version(版本),并进行初始化操作,例如为1。
    2.然后该客户端a通过muti命令开启事务,然后将对该key的修改操作添加到事务命令队列中,此时我们还没有
    执行该事务,但是redis已经将该key的value和version保存到了自己客户端缓存中,此时version为1。
    3.然后另外有一个客户端b对该key进行了修改操作,这个修改不仅修改了key的value同时也增加了version的值,例如
    使version增加了1,变为了2。
    4.然后客户端a执行exec命令执行事务。当它执行到对key的修改命令的时候,会先对自己客户端中保存的version和当前key中的
    version值进行比较。如果缓存中的version小于key中的version,说明当前客户端缓存的key的value已经过时,执行该修改操作的话可能
    会破坏数据的一致性,所以不会执行该修改操作。
    注意:当事务执行之后,无论是否执行成功,那么对watch的key的监控就会消失,也可以通过UNWATCH命令取消对key的监控。
    不使用watch命令对key进行监控只使用事务的话隔离性无法实现,同样的,只使用watch命令不使用事务也是无法实现隔离性的。

    不使用watch和事务的多线程修改操作
    image
    image
    image
    使用watch命令和事务的多线程修改操作
    image
    image
    image
    image
    image
    不使用watch命令只使用事务的多线程修改操作
    image
    image
    不使用事务只使用watch命令的多线程修改操作
    image
    image

posted on 2025-09-28 11:03  jaba  阅读(12)  评论(0)    收藏  举报

导航