zoukankan      html  css  js  c++  java
  • redis事务和锁

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

      开启事务:multi  作用:设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中

      执行事务:exec  作用:设定事务的结束位置,同时执行事务。与multi成对出现,成对使用

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

      事务定义过程中发现出了问题: 

        取消事务  discard  作用:终止当前事务的定义,发生在multi之后,exec之前

      

       

     基于特定条件的事务执行——锁:

      业务场景:

        天猫双11热卖过程中,对已经售罄的货物追加补货,4个业务员都有权限进行补货。补货的操作可能是一系列的操作,牵扯到多个连续操作,如何保障不会重复操作?
      业务分析:

        多个客户端有可能同时操作同一组数据,并且该数据一旦被操作修改后,其他客户端将不适用于继续操作
        在操作之前锁定要操作的数据,一旦发生变化,终止当前操作

       解决方案:

        对 key 添加监视锁(必须在事务开启之前添加监视锁),在执行exec前如果key发生了变化,终止事务执行

          watch key1 [key2……]

        取消对所有 key 的监视

          unwatch

    基于特定条件的事务执行——分布式锁:

      业务场景:

        天猫双11热卖过程中,对已经售罄的货物追加补货,且补货完成。客户购买热情高涨,3秒内将所有商品购买完毕。本次补货已经将库存全部清空,如何避免最后一件商品不被多人同时购买?【超卖问题】
      业务分析:

        使用watch监控一个key有没有改变已经不能解决问题,此处要监控的是具体数据
        虽然redis是单线程的,但是多个客户端对同一数据同时进行操作时,如何避免不被同时修改?

      解决方案:

        使用 setnx 设置一个公共锁

          setnx lock-key value

        利用setnx命令的返回值特征:执行上面的命令,如果有值(别人已经设置了)则返回设置失败,无值则返回设置成功
          对于返回设置成功的,拥有控制权,进行下一步的具体业务操作
          对于返回设置失败的,不具有控制权,排队或等待
        操作完毕通过del操作释放锁  del  lock-key
        注意:上述解决方案是一种设计概念,依赖规范保障(必须使用同一把锁,也就是大家都使用同一个lock-key),具有风险性

    基于特定条件的事务执行——分布式锁改良

      业务场景:

        依赖分布式锁的机制,某个用户操作时对应客户端宕机,且此时已经获取到锁。如何解决?

      业务分析:

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

      解决方案:

         使用 expire 为锁key添加时间限定,到时不释放,放弃锁

          expire lock-key second
          pexpire lock-key milliseconds

        由于操作通常都是微秒或毫秒级,因此该锁定时间不宜设置过大。具体时间需要业务测试后确认。
          例如:持有锁的操作最长执行时间127ms,最短执行时间7ms。
          测试百万次最长执行时间对应命令的最大耗时,测试百万次网络延迟平均耗时
          锁时间设定推荐:最大耗时*120%+平均网络延迟*110%
          如果业务最大耗时<<网络平均延迟,通常为2个数量级,取其中单个耗时较长即可

  • 相关阅读:
    PTA —— 基础编程题目集 —— 函数题 —— 61 简单输出整数 (10 分)
    PTA —— 基础编程题目集 —— 函数题 —— 61 简单输出整数 (10 分)
    练习2.13 不用库函数,写一个高效计算ln N的C函数
    练习2.13 不用库函数,写一个高效计算ln N的C函数
    练习2.13 不用库函数,写一个高效计算ln N的C函数
    迷宫问题 POJ 3984
    UVA 820 Internet Bandwidth (因特网带宽)(最大流)
    UVA 1001 Say Cheese(奶酪里的老鼠)(flod)
    UVA 11105 Semiprime Hnumbers(H半素数)
    UVA 557 Burger(汉堡)(dp+概率)
  • 原文地址:https://www.cnblogs.com/roadlandscape/p/12456958.html
Copyright © 2011-2022 走看看