zoukankan      html  css  js  c++  java
  • Redis入门到精通(十三)——事务的基本操作(开启/执行/取消)、事务工作流程、事务的锁、事物的分布式锁(setnx)、事务死锁解锁

    什么是事务(Redis中的事务在实际开发中还是用的比较少的)

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

    一、事务的基本操作

    开启事务 
    multi        #设定事务的开启位置,此指令执行后,后续的所有指令均加到事务中
    
    执行事务
    exec        #设定事务的结束位置,同时执行事务。与multi成对出现,成对使用,最后返回的是每一个命令的返回结果

    注意:加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行

    取消事物

    discard      #终止当前事务的定义,发生在multi之后,exec之前

    二、事务的工作流程

    三、事务的注意事项

    定义事务过程中,命令格式输入错误怎么办

    语法错误:命令书写格式有误   比如设置key是写set,错误写成了tes
    处理结果:如果定义的事务中所包含的命令存在语法错误,整体事务中所有命令均不会执行。包括那些正确的命令。

    定义事务的过程中,命令语法执行出现错误怎么办

    运行错误:指命令格式正确,但是无法正确的执行。例如对list进行incr操作或者对str类型进行lpush
    处理结果:能够正确运行的命令去执行,运行错误的命令不执行

    手动进行事务的回滚

    四、事务的锁

    解决方案

    对key添加监视锁,在执行exec前如果key发生了变化,终止事务执行
    watch key1 key2
    
    取消对所有key的监视
    unwatch

    注意:watch监视要在事务开启之前(multi)设置,如果其他客户端对监视的key做修改,那么exec得到的结果为nil

    五、事务分布式锁

    业务场景:超卖问题——基于分布式锁对应的场景控制

    解决方案

    使用setnx设置一个公共锁       setnx lock-key value

    利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功 (购买之前先判断是否存在库存)
      1.对于返回设置成功的,拥有控制权,进行下一步的具体业务操作:对库存数据增减操作
      2.对于返回值设置失败的,不具有控制权,排队或者等待
    操作完毕通过del操作释放锁:del lock-key
    lock-key是锁名,value可以随意设置
    注意:必须多个客户端同时使用相同的锁名,如果设置上锁,其他客户端再想设置锁的话会失败,需要等待前一个客户端释放锁

    六、事务死锁解决方案

    由于锁操作由用户控制加锁解锁,必定会存在加锁后未解锁的风险。
    需要解锁操作不能仅依赖用户控制,系统级别要给出对应的保底处理方案

    解决方案

    使用expire为锁key添加时间限定,到时间不释放,放弃锁
    expire  lock-key  second         #设置时间单位为秒
    pexpire lock-key milliseconds     #设置时间为毫秒

  • 相关阅读:
    Java常用API(Arrays类)
    Java常用API(String类)
    Java常用API(Random类)
    Java匿名对象介绍
    Qt串口实现921600波特率的方法
    Qthread实现多线程操作
    小品QIODevice::Text参数
    Qt串口通信
    Linux下挂载新的磁盘
    互斥锁陷阱:优先级反转、死锁
  • 原文地址:https://www.cnblogs.com/wangcuican/p/12899975.html
Copyright © 2011-2022 走看看