-1

我使用 MSETNX ( http://redis.io/commands/msetnx ) 作为锁定系统,只有在没有锁存在的情况下才会锁定所有键。

如果持有锁的机器死了,那把锁就会卡住——这是个问题。

我的理想答案是默认情况下所有密钥都会在 15 秒内过期,因此即使机器死机,它持有的锁也会在短时间内自动重置。这样我就不必对我设置的每个键都调用 expire 。

这有可能吗?

4

2 回答 2

3

要构建一个高可用的可靠锁,请查看此文档:http ://redis.io/topics/distlock

该算法仍处于测试阶段,但在几个会话中进行了压力测试,并且无论如何可能比单实例方法更可靠。

有几种语言的参考实现(在文档中链接)。

于 2014-07-18T08:32:50.810 回答
2

Redis 没有内置的方法来执行 MSETNX 并以原子方式使所有密钥一起过期。您也不能为密钥设置默认到期管。

您可以考虑:1. 使用包装多个“SET key value EX 15 NX”的 WATCH/MULTI/EXEC 块,或 2. 使用 Lua 服务器端脚本执行此操作。

于 2014-07-16T17:03:38.003 回答