在redis文档中,我发现可以通过SETNX实现原始锁:
http://redis.io/commands/setnx
然而,正如一些用户所评论的,使用UNIX时间戳作为过期需要客户端和服务器的时间完全同步。在Redis中是否有更好的方法来创建全局/分布式锁?
发布于 2013-12-23 09:55:59
使用SET而不是SETNX。SET接受以秒和毫秒为单位的过期时间参数,而不是UNIX时间戳值。
基于SETNX的旧模式仅因历史原因而记录在案。
来自SETNX 描述
注意:从Redis 2.6.12开始,可以使用SET命令创建一个简单得多的锁定原语来获取锁,并创建一个简单的Lua脚本来释放锁。模式记录在SET命令页中。
发布于 2013-12-23 10:09:59
使用redis >= 2.6,LUA脚本解决方案将是很棒的。Lua脚本总是以原子方式执行,因此:
--lockscript, parameters: lock_key, lock_timeout
local lock = redis.call('get', KEYS[1])
if not lock then
return redis.call('setex', KEYS[1], ARGV[1], "locked");
end
return false基于SET命令新选项的另一种解决方案
SET lock_key "locked" EX lock_timeout NX 使用redis < 2.6,可以使用多个模式:
MULTI
SETNX tmp_unique_lock some_value
EXPIRE tmp_unique_lock
RENAMENX tmp_unique_lock real_lock
EXEC发布于 2014-03-24 12:35:00
设置的新参数足以设置锁,但这些参数仅适用于Redis >= v2.6.12,您还需要考虑锁将如何解除和过期等等。
我在我们的工程博客上写了一篇关于使用Redis的分布式锁的文章。它涵盖了如何可靠地设置和释放锁的脚本,以及验证和死锁预防。我还包括一个用Node.js编写的模块,您可以直接使用它进行锁定。
https://stackoverflow.com/questions/20736102
复制相似问题