Redis实现分布式锁原理

Dear 丶 2023-09-26 23:19 226阅读 0赞

Redis实现分布式锁原理

  • 数据库作为分布式锁实现方案
    • 第一步
    • 第二步
    • 第三步
    • 第四步
    • 第五步
    • 第六步
  • Redis实现分布式锁原理
    • 第一步
    • 第二步
    • 第三步
    • 第四步
    • 第五步

在这里插入图片描述我们都知道, lock或者synchronized只在单个JVM中有效。由于订单系统在多机器部署,因此相对于整个集群环境来说,同时操作一份共享的变量或者数据,就存在不安全的问题了。

数据库作为分布式锁实现方案

在这里插入图片描述
我们可以创建一个单独的表作为分布式锁的一个操作表,表中有一个注解。表中有一个唯一的主键。

借助数据库主键唯一策略就可以来控制锁。

第一步

线程1尝试往表中存入一个唯一的字符串。

如果能成功地存入,则认为该线程可以拿到锁。

就可以继续进行第二步操作了。

第二步

线程1拿着锁去操作数据库。

第三步

在线程1操作过程当中,突然线程2尝试获取锁,其实就是往数据库中存入相同的唯一标识。

由于数据库的主键唯一策略的约束,发现存不进去,则获取锁失败——进入阻塞等待状态。

第四步

线程1业务系统处理完成后,会删除uuid-abc字符串(释放锁)。

第五步

由于第4步释放了锁,因此在此线程2重复第3步,发现能获取到锁了。

第六步

拿着锁执行业务。

Redis实现分布式锁原理

在这里插入图片描述
利用redis的key唯一和redis的SetNX(key, value)命令作为存储条件。

redis命令的作用就是往redis存储一个key,value。如果key不存在,则能存成功,key已存在,则存不成功。

第一步

线程1尝试往表中存入一个唯一的标识。

如果成功存入,则认为该线程能够拿到锁。

第二步

线程1拿着锁去操作数据库。

第三步

线程2尝试去获取锁,类似的,也是往其中存入相同的字符串。由于setNx的特性,发现存不进去,则获取锁失败,进入阻塞等待状态。

第四步

同样会把其删掉,业务系统处理完业务,删除uuid-abc的key(释放锁)。

第五步

重复第三步的操作,因此就能获得锁了。

参考资料:Redis实现分布式锁原理(面试常问)

发表评论

表情:
评论列表 (有 0 条评论,226人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis分布式实现原理

    认识分布式系统        服务架构的大致发展流程和分类,说了大致啊不必细究,毕竟只是为了方便对分布式不了解的同学有个初步认知。 MVC架构 :当业务规模很小时