我有一个Java应用程序,它在本地网络上有多个示例。它使用Redis Redlock来管理共享数据库的完整性。这里的问题是这个java应用程序仍然非常不稳定,所以它崩溃了很多次。当一个示例崩溃时,它在崩溃时持有锁,所有其他示例都会卡住。我的问题是,当一个持有锁的Java应用程序示例崩溃时,我可以从Redis CLI释放锁吗?
vuktfyat1#
通过CLI,我可以用命令DEL <lock name>从Redis服务器上移除锁。这样做的时候,等待的线程就可以获取锁。我不知道这条路对不对。但这很有效。
DEL <lock name>
kr98yfug2#
del <lock name>是正确的,也是释放锁的好方法。我只是想解释为什么上面的工作,是一个快速和简单的方法来释放一个陈旧的锁!公认的答案表明这是一个“黑客”或什么的,所以我担心应用它;发现完全没问题看起来redis只是在锁的名称下存储了一个唯一的ID密钥。因此,如果您获取一个名为foo的锁,您可以看到锁的值:
del <lock name>
foo
get foo
你可以在这里看到一个ID,例如:aeec8bc0598311ffacfd0242ac110005。因此,任何其他试图获取锁的人,redis只需将他们的ID与存储在foo中的值进行比较并拒绝他们。当锁被释放时,它被删除。如果你手动删除锁(del foo),那么它只是手动做了Redis在后台自然释放锁时会做的事情。
aeec8bc0598311ffacfd0242ac110005
del foo
2条答案
按热度按时间vuktfyat1#
通过CLI,我可以用命令
DEL <lock name>
从Redis服务器上移除锁。这样做的时候,等待的线程就可以获取锁。我不知道这条路对不对。但这很有效。kr98yfug2#
del <lock name>
是正确的,也是释放锁的好方法。我只是想解释为什么上面的工作,是一个快速和简单的方法来释放一个陈旧的锁!公认的答案表明这是一个“黑客”或什么的,所以我担心应用它;发现完全没问题
看起来redis只是在锁的名称下存储了一个唯一的ID密钥。因此,如果您获取一个名为
foo
的锁,您可以看到锁的值:你可以在这里看到一个ID,例如:
aeec8bc0598311ffacfd0242ac110005
。因此,任何其他试图获取锁的人,redis只需将他们的ID与存储在
foo
中的值进行比较并拒绝他们。当锁被释放时,它被删除。如果你手动删除锁(
del foo
),那么它只是手动做了Redis在后台自然释放锁时会做的事情。