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实现分布式锁原理(面试常问)