带有 EX 和 NX 的 Ruby REDIS

ans*_*410 4 ruby locking redis ruby-on-rails-3

我正在尝试在我们的 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
Run Code Online (Sandbox Code Playgroud)

抛出错误:

ArgumentError: wrong number of arguments (given 5, expected 2..3)
Run Code Online (Sandbox Code Playgroud)

还有另一种方法可以做到这一点,但它需要两次 REDIS 调用。

if(REDIS.setnx "key", "value")
    REDIS.setex "key", 3600, "value"
end
Run Code Online (Sandbox Code Playgroud)

该方法不是优选的。我正在寻找一种在 ruby​​ 中通过单个 REDIS 调用来获取 REDIS 锁的方法。基本上“SET resource-name anystring NX EX max-lock-time”在 ruby​​ 中等效。

谢谢,

安舒尔

Boo*_*reg 6

看起来这是在 v3.2.2 的 Redis(gem)中添加的,请参阅 PR 547。它应该像标志一样使用,而不是作为裸字符串,请参阅 test

r.set("foo", "qux", :nx => true)
Run Code Online (Sandbox Code Playgroud)

这让我相信你应该能够做到这一点:

r.set("foo", "qux", :nx => true, :ex => 2.hours)
Run Code Online (Sandbox Code Playgroud)