我需要BRPOP
然后将弹出的值添加到带有ZADD
的有序集合中。我看到两个解决方案(我正在使用Ruby):
redis-rb
' multi { ... }
阻止。但是,在这里我不能使用ZADD
命令中的弹出值,因为这不是redis-rb
实现此块的方式。通过这些,我只能用非原子方式来实现这一点,即使用redis-rb
来顺序触发这些命令。但是,我真的需要原子性。实现这个目标的方法是什么?
答案 0 :(得分:3)
您可以将RPOP
和ZADD
包装在Lua脚本中,例如RPOPZADD
,以原子方式运行它们,并在客户端做一些工作来模拟阻塞行为。
以下是伪代码:
while (true) {
bool ret = redis.eval(RPOPZADD); // return immediately
if (!ret) {
// No item in the list, wait for a while
sleep(1);
}
}
答案 1 :(得分:3)
TL; DR是不可能的。
你可以,如果你没有挂在列表上的poppin',请查看我的新模块以及对Redis核心的闪亮的新请求。
答案 2 :(得分:2)
您没有指定需要排序集的原因,如果您可以解决它并使用列表,则可以使用BRPOPLPUSH
将元素原子地移动到其他列表,并在以后对其进行排序非原子方式。
另一种选择是编写一个Redis模块,为您做到这一点 - modules blocking ops