2016-01-21 110 views
0

我想將一個隊列清空到另一個隊列中。我認爲RPOPLPUSH將是我的工具,運行它直到隊列耗盡。我想在原子步驟中做到這一點,所以我認爲Lua腳本將成爲我的工具。將隊列數據移動到另一個隊列的頭部

不幸的是我寫的腳本沒有工作。相反,它看起來陷入了無限循環。這是代碼:

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

腳本沒有錯 - 它在我的本地Redis上運行完全正常。一個無限循環會在定義的'lua-time-limit'之後觸發來自Redis的BUSY響應 - 是你看到的行爲? –

+0

@ItamarHaber是的,我可以證實,這就是行爲。無論source_queue是否有數據或是空的 –

回答

1

的條件until是錯誤的。如果在空源列表上執行rpoplpush,則返回niluntil not x會產生無限循環。試試這個:

if KEYS[1] == KEYS[2] then 
    return 
end 
local x 
repeat 
    x = redis.call('rpoplpush', KEYS[1], KEYS[2]) 
until x ~= nil 
+0

這似乎不對。調用'rpoplpush'會在空的源列表上返回'false'。 –

+0

這是Lua腳本,在Redis的throw eval命令中執行。如果源列表爲空,它將返回'nil'。 – misterion

+0

這對你有什麼回報?我正在運行Redis 3.0。 'r.eval(「」「if redis.call('rpoplpush','empty_queue','emtpy_queue')== nil然後返回'this is nil'else return'this not nil'end」「」,0 )' –

相關問題