首页 > 其他 > 详细

面试二十、redis分布式锁

时间:2021-08-30 12:04:34      阅读:17      评论:0      收藏:0      [点我收藏+]

1、分布式锁

  redission开源框架

技术分享图片

2、加锁机制

  当客户端加锁请求进来,redisson会根据hash算法选择一个节点(如果是集群的话)的主节点,也就是只选择集群里的一台机器。

  随后向这台节点发送一段lua表达式(将一大堆复杂业务逻辑封装在lua表达式可以保证业务逻辑执行的原子性)。

  加锁代码逻辑:先判断锁是否已经存在,不存在则设置锁(锁会存当前客户端的id),然后设置超时时间默认30秒。

3、锁互斥机制

  当客户端1已经拿到锁了,客户端2进来后会去判断锁是否已经存在,发现锁已经存在了

  再判断锁里存的客户端id是否包含客户端2,很明显锁里存的是客户端1的id

  于是返回该锁剩余的时间,之后客户端2会进入一个while循环,一直尝试获取锁。

4、看门狗

  每隔10秒会检查客户端是否还持有锁,如有则延长时间将超时时间重新设为30秒。

  这样可以保证客户端能一直持有锁,同时如果因为客户端宕机锁也会自动释放

  解决了两个场景:

    1)设置超时时间,执行者无法判断到底业务逻辑时间会需要执行多少时间,如果设置短了就会导致

      业务逻辑没执行完锁释放了

    2)不设置超时时间,如果客户端执行过程中宕机了导致没有调用unlock,锁就一直释放不了

5、可重入锁

  当客户端1已经拿到锁了,因为业务逻辑客户端1再次进来后会去判断锁是否已经存在,发现锁已经存在了

  再判断锁里存的客户端id是否包含客户端1,很明显锁里存的是客户端1的id

  于是将锁里存的加锁次数加1

6、释放锁机制

  unlock()方法会将锁里存的加锁次数减1,减到0时删除掉锁,即解锁

7、存在的问题

  客户端1请求加锁,节点1接受到加锁命令,这时因为意外原因节点1宕机且刚好还没有将加锁信息同步到其他节点

  客户端2请求加锁,节点2变成主节点发现没有锁信息,加锁成功。结果导致了两个客户端都获得了锁。

面试二十、redis分布式锁

原文:https://www.cnblogs.com/jijiecong/p/15195530.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!