实现分布式锁的主要方式有Redis和Zookeeper。Zookeeper实现分布式锁比Redis简单,Zookeeper有一个特性,多个线程在Zookeeper里创建同一个节点时,只有一个线程执行成功。
Zookeeper主要是利用临时有序节点这一特性实现分布式锁。
-
客户端A发起加锁请求, 向Zookeeper中的order_locak节点下创建有序临时节点order_0000000;
-
判断客户端A是不是order_locak节点下序号最小的节点(当前只有一个节点, 该节点本身就是最小节点), 是: 加锁 ----> 执行业务逻辑----> 执行完毕, 释放锁(删除节点).
-
客户端B发起加锁请求, 向Zookeeper中的order_locak节点下创建临时节点order_0000001, 序号自增;
-
假设现在客户端A还没释放锁, 那么根节点下有两个节点, 使当前节点监听上一个节点, 一旦监听到上一个节点被删除(释放锁), 判断客户端B是不是order_locak节点下序号最小的节点, 是: 加锁, 重复上面的流程, 否: 继续等待判断是不是当前节点是不是序号最小的节点.