之前学习Redis时候,我们利用Redis实现了分布式锁。
黑马点评项目Redis实现分布式锁_兜兜转转m的博客-CSDN博客
为什么提出了分布式锁的概念呢?
因为在单体项目中,锁是基于JVM虚拟机实现的,在分布式情况下,JVM就不唯一了,因此需要一个引入其他中间件来充当锁这一个概念。
Zk实现分布式锁的原理
核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点。
- 每个客户端获取锁时,在lock节点下创建临时顺序节点。
- 然后获取lock下面的所有子节点,客户端获取到所有的子节点之后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁。使用完锁后,将该节点删除。
- 如果发现自己创建的节点并非lock所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,同时对其注册事件监听器,监听删除事件。
- 如果发现比自己小的那个节点被删除,则客户端的Watcher会收到相应通知,此时再次判断自己创建的节点是否是lock子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。
根据以上步骤就可以保证分布式锁了。其中最重要的已经标红了。
首先每个客户端建立临时节点,然后判断是否自己是最小的节点,如果是则获取锁,如果不是则监听前一个比自己小的节点,如果该节点删除,再次判断是自己是否是序号最小的。如果是则获取锁。
当然Curator已经帮我们封装好了。
在
Curator
中有五种锁
方案:
- InterProcessSemaphoreMutex:分布式排它锁(非可重入锁)
- InterProcessMutex:分布式可重入排它锁
- InterProcessReadWriteLock:分布式读写锁
- InterProcessMultiLock:将多个锁作为单个实体管理的容器
- InterProcessSemaphoreV2:共享信号量