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     #设置时间为毫秒

  • 相关阅读:
    解释机器学习模型的一些方法(一)——数据可视化
    机器学习模型解释工具-Lime
    Hive SQL 语法学习与实践
    LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)
    LeetCode 148. 排序链表(Sort List)
    LeetCode 18. 四数之和(4Sum)
    LeetCode 12. 整数转罗马数字(Integer to Roman)
    LeetCode 31. 下一个排列(Next Permutation)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    论FPGA建模,与面向对象编程的相似性
  • 原文地址:https://www.cnblogs.com/wangcuican/p/12899975.html
Copyright © 2011-2022 走看看