Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带EX和NX的Ruby REDIS_Ruby_Ruby On Rails 3_Redis_Locking - Fatal编程技术网

带EX和NX的Ruby REDIS

带EX和NX的Ruby REDIS,ruby,ruby-on-rails-3,redis,locking,Ruby,Ruby On Rails 3,Redis,Locking,我正在尝试在rails应用服务器中实现锁定 如果我想获得一个永久的锁,那么REDIS.setnx工作得很好。但我想获得到期的锁,基本上我希望锁在一定时间后到期,这样锁就可以自由地再次获得 从REDIS的set文档中,我看到这是可能的。 “命令SET resource name anystring NX EX max lock time是使用Redis实现锁定系统的一种简单方法。” 如何在ruby中实现这一点。 命令: REDIS = Redis.new(host: ENV['REDIS_HOST

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

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

从REDIS的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中的“设置资源名anystring NX EX max lock time”等价物

谢谢


Anshul

看起来这是在v3.2.2的Redis(创业板)中添加的。 它应该像一个标志一样使用,而不是像一个空字符串一样使用

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

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

看起来这是在v3.2.2的Redis(gem)中添加的。 它应该像一个标志一样使用,而不是像一个空字符串一样使用

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

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

看起来与您所评论的有所不同。REDIS.set(“foo2”,“qux”,“nx=>true,:ex=>2.hours”)工作正常。谢谢你的提示。谢谢你的更正。有趣的是,它们不使用expires_in或expires_at标志,这与使用普通键时的标志相同。我打开了一个问题,询问在中使用expires_和EX是否有价值:看起来与您所评论的略有不同。REDIS.set(“foo2”,“qux”,“nx=>true,:EX=>2.hours)工作正常。谢谢你的提示。谢谢你的更正。有趣的是,它们不使用expires_in或expires_at标志,这与使用普通键时的标志相同。我提出了一个问题,询问在EX中使用expires_是否有价值: