Redis实现分布式锁原理

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



Redis分布式锁和集群模式 redis集群分布式锁原理_redis

我们都知道,

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

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

Redis分布式锁和集群模式 redis集群分布式锁原理_Redis分布式锁和集群模式_02


我们可以创建一个单独的表作为分布式锁的一个操作表,表中有一个注解。表中有一个唯一的主键。

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

第一步

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

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

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

第二步

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

第三步

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

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

第四步

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

第五步

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

第六步

拿着锁执行业务。

Redis实现分布式锁原理

Redis分布式锁和集群模式 redis集群分布式锁原理_数据库_03


利用redis的key唯一和redis的SetNX(key, value)命令作为存储条件。

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

第一步

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

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

第二步

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

第三步

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

第四步

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

第五步

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

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