带有EX和NX的Ruby REDIS

时间:2018-01-18 09:47:54

标签: ruby ruby-on-rails-3 redis locking

我正在尝试在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

1 个答案:

答案 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)