对于ZK而言,主要依赖于ZK的临时顺序节点以及节点的监听机制去实现分布式锁,下面以锁的lock()方法进行一个具体的叙述。
1.tryLock()尝试获取锁
a.根据锁定的key创建持久化节点
b.在持久化节点的下面,创建临时顺序节点
c.判断创建的节点是否为顺序节点中最小的节点,如果是,则锁定成功,如果不是,则锁定失败
2.如果获取锁失败,监听创建节点的上一个节点的删除状态,如果节点被删除,则判断当前节点是否为最小节点,如果是最小节点,则返回锁定成功,否则抛出异常
3.如果获取锁成功,直接返回。
其实这里主要想记录的一个东西是ZK和Redis的优缺点比较。
主要从两点去考虑吧,第一点高性能,ZK因为需要保证强一致性,所以牺牲了性能,但是对于Redis而言,本身就具有较高的性能。第二点是可用性,ZK从CAP的角度去说的话,是保证了强一致性,没有保证可用性的,但是从分布式锁的角度考虑,并不会存在锁丢失的问题,而Redis主节点宕机的情况下,可能会导致锁丢失。