十9、Redis分布式锁、Zookeeper分布式锁

1、Redis分布式锁
   一、线程调用setnx(lockkey,currentTime+timeout),设置成功,也就是返回true,给这个key设置有效期;
  二、设置成功,调用expire(lockkey,timeout),设置锁的过时时间,执行业务,而后调用del(lockkey),释放锁。
  三、设置失败,表示当前锁正在使用,则调用get(lockkey) 获得valueA;
  四、若是valueA!=null && currentTime (当前时间毫秒数)>valueA,表示超时,执行5;
  五、超时时,调用getset(lockkey,currentTime+timeout) 获得valueB,若是valueB ==null || valueA == valueB,得到锁操做步骤6,不然说明锁被其余线程获取了;
  六、处理完业务逻辑,再去判断锁是否超时,若是没超时删除锁,若是已超时,不用处理。
流程如图: node

2、Zookeeper分布式锁
  一、客户端对某个方法加锁时,在zk上的与该方法对应的指定locker节点的目录下,生成一个惟一的瞬时有序节点node1;
   二、客户端获取该路径下全部已经建立的子节点,若是发现本身建立的node1的序号是最小的,就认为这个客户端得到了锁;
  三、若是发现node1不是最小的,则尚未获取到锁,监听比本身建立节点序号小的最大的节点,进入等待;
  四、获取锁后,处理完逻辑,删除本身建立的node1;
  五、删除4中监听节点,则客户端的Watcher会收到相应通知,此时再次判断本身建立的节点是不是locker子节点中序号最小的,若是是则获取到了锁,若是不是则重复以上步骤继续获取到比本身小的一个节点并注册监听。
  流程如图:
Redis分布式锁和Zookeeper分布式锁区别:zk性能差一些,开销大,实现简单。
相关文章
相关标签/搜索