代码之家  ›  专栏  ›  技术社区  ›  anshul410

带EX和NX的Ruby REDIS

  •  1
  • anshul410  · 技术社区  · 6 年前

    我正在尝试在rails应用服务器中实现锁定。

    REDIS。如果我想永远获得一个锁,setnx工作得很好。但我想获得过期的锁,基本上我希望锁在一定的时间后过期,这样锁就可以自由地再次获得。

    从REDIS的set文档中,我看到这是可能的。 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锁的方法。ruby中的“SET resource name anystring NX EX max lock time”基本上是等效的。

    谢谢

    安舒尔

    1 回复  |  直到 6 年前
        1
  •  4
  •   anshul410    6 年前

    看起来这是在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)