【问题标题】:Ruby REDIS with EX AND NX带有 EX 和 NX 的 Ruby REDIS
【发布时间】:2018-01-18 19:11:39
【问题描述】:

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

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

谢谢,

安舒尔

【问题讨论】:

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


    【解决方案1】:

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

    r.set("foo", "qux", :nx => true)
    

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

    r.set("foo", "qux", :nx => true, :ex => 2.hours)
    

    【讨论】:

    • 看起来与您评论的内容略有不同。
    • REDIS.set("foo2", "qux", :nx => true, :ex => 2.hours) 有效。感谢您的提示。
    • 感谢指正。有趣的是,他们不使用与普通键相同的 expires_in 或 expires_at 标志。我打开了一个问题,询问使用 expires_in 和 EX 是否有价值:github.com/redis/redis-rb/issues/738
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2017-06-06
    • 2020-07-11
    • 2021-05-23
    • 2015-08-24
    • 2012-05-28
    相关资源
    最近更新 更多