背景

我意识到一个redis客户端(支持集群),并且提出了一个问题,以支持redis集群所做的分布式锁 .

我已经阅读了redlock算法和相关辩论的帖子

问题

实际上,不可能将一个密钥散列到redis集群中的不同节点,并且很难在特定规则中生成密钥,并确保它们不会在集群中迁移 . 在最坏的情况下,所有密钥槽可能存在于一个节点中 . 然后,可用性将与一个节点中的一个密钥相同 .

我的算法

我的解决方案是利用 READONLY 从站模式来确保锁定密钥从主站同步到其从站的N / 2 1,以避免故障转移问题 . 由于它是单键解决方案,迁移问题也无关紧要 .

  • random token SETNX 到期时获取集群主节点中的锁

  • 如果成功获取锁定,则使用 READONLY 模式检查从属节点中的锁定(可能有N个从属节点),如果N / 2 1同步成功则打破检查并返回True

  • 使用redlock算法中描述的lua脚本释放与具有随机生成的令牌的客户端的锁定,如果客户端崩溃,则等待锁定密钥到期 .

你能帮我一个忙,看看算法是不是错了?我曾经想过几个关于它的案例,但我仍然不太确定 .