基于zookeeper的实现
方案一
获取锁:让多个 Client 同时创建一个临时节点,由于节点的唯一性,故此只会有一个 Client 创建成功。而创建成功的 Client 代表其持有该分布式锁。其余创建失败的 Clients 就在该节点上注册监听。
释放锁:利用临时节点「会话中断,节点删除」的特点,实现锁的释放。
方案二
获取锁:让多个 Client 各自创建一个 临时顺序节点,每次让顺序号最小的节点的 Client 持有分布式锁。让每个 Client 监听最后一个序号比它小的节点。
释放锁:同样,利用临时节点「会话中断,节点删除」的特点,实现锁的释放。
进阶:实现读写锁
读写锁:读锁允许多个读请求同时完成;写锁只允许一个写请求进行;当上了写锁时,不允许上读锁;当上了读锁时,不允许上写锁。
当发送读请求时,先创建一个临时顺序节点,然后进行对比
- 当没有比自己更小的节点,或比自己小的节点都是读请求时,直接获取读锁
- 当有比自己小的节点,同时有写请求时,就监听最后一个序号比自己小的写请求节点。
当发送写请求时,先创建一个临时顺序节点,然后进行对比
- 当没有比自己更小的节点时,直接获取写锁
- 当有比自己更小的节点时,监听最后一个序号比自己小的节点
参考
基于Redis的实现
未完待续
网友评论