我正在尝试在rails应用服务器中实现锁定。
如果我想永远获得锁,REDIS.setnx可以正常工作。但我希望获得有效期限的锁定,基本上我希望锁定在一定时间后过期,以便锁定可以再次获得。
从REDIS的设置文档中,我发现它是可能的。 https://redis.io/commands/set “命令SET resource-name anystring NX EX max-lock-time是一种使用Redis实现锁定系统的简单方法。”
如何在ruby中实现这一点。 命令:
REDIS = Redis.new(host: ENV['REDIS_HOST'], port: ENV['REDIS_PORT'])
REDIS.set "key", "value", "nx", "ex", 3600
抛出错误:
ArgumentError: wrong number of arguments (given 5, expected 2..3)
还有另一种方法,但它需要两次REDIS调用。
if(REDIS.setnx "key", "value")
REDIS.setex "key", 3600, "value"
end
此方法不是优选的。我正在寻找一种方法来获取REDIS锁定与ruby中的单个REDIS调用。在ruby中基本上“SET resource-name anystring NX EX max-lock-time”等效。
谢谢,
Anshul
答案 0 :(得分:4)
看起来这是在v3.2.2 see PR 547中的Redis(宝石)中添加的。 它应该像标志一样使用,而不是作为一个简单的字符串see test使用。
r.set("foo", "qux", :nx => true)
这让我相信你应该能够做到这一点:
r.set("foo", "qux", :nx => true, :ex => 2.hours)