分布式锁的实现
redlock(redis nx)注意锁的过期时间,lockvalue需要保证唯一,防止被其他的应用释放了锁
gc也会导致锁的过期时间跳过(尤其是full gc)
zookeeper实现分布式锁
临时有序节点进行实现
-
创建锁节点 在 ZooKeeper 中,每个锁对应一个节点。所有需要获取锁的客户端都会在这个节点下创建一个临时有序节点(EPHEMERAL_SEQUENTIAL)。例如,锁节点路径为 /locks,客户端会在 /locks 下创建子节点 /locks/lock-0000000000、/locks/lock-0000000001 等。
-
获取锁 客户端创建临时有序节点后,需要判断自己创建的节点是否是 /locks 目录下序号最小的节点。如果是,则获取锁;如果不是,则监听比自己序号小的前一个节点的删除事件。
-
释放锁 客户端在完成任务后,删除自己创建的临时有序节点。此时,ZooKeeper 会通知下一个序号最小的节点,告知其可以获取锁。
-
处理锁的竞争 当多个客户端同时尝试获取锁时,只有一个客户端能够成功创建最小序号的节点并获取锁。其他客户端会被阻塞,直到锁被释放并轮到它们获取锁。
评论
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
