我想将队列清空到另一个队列。我假设RPOPLPUSH
将成为我的工具,运行它直到排队耗尽。我想在原子步骤中做到这一点,所以我认为Lua脚本将成为我的工具。
不幸的是我写的脚本不起作用。相反,它看起来停留在无限循环中,并在超时后触发BUSY错误。这是代码:
local x
if KEYS[1] == KEYS[2] then
return
end
repeat
x = redis.call('rpoplpush', KEYS[1], KEYS[2])
until not x
这是我用来执行它的Python客户端代码:
script = """
...same script as above...
"""
redis.eval(script, 2, 'source_queue', 'dest_queue')
答案 0 :(得分:1)
until
中的条件错误。如果rpoplpush
在空源列表上执行,则返回nil
并且until not x
产生无限循环。试试这个:
if KEYS[1] == KEYS[2] then
return
end
local x
repeat
x = redis.call('rpoplpush', KEYS[1], KEYS[2])
until x ~= nil