2017-03-06 63 views
0

我有一個包含我想執行服務器端處理密鑰的SET SPOP和SADD到另一組。如何從一組使用Lua

我想SPOP和項目,然後也薩德另一組。

因此,我將有以下2套:

1. Source 
2. Processing 

我不能使用SUNIONSTORE#1 POP和存儲在#2,因爲我需要把所有我所處理的關鍵。

我想這個過程是原子的,我怎麼能做到這一點用LUA?

另外,如果我想SPOP超過1個鍵,我還可以用LUA這個?

更新

redis.replicate_commands() 
local s = KEYS[1] 
local p = KEYS[2] 
local u = KEYS[3] 
local ele = redis.call("SPOP", s) 
if redis.call("SISMEMBER", ele, u) == 0 then 
    redis.call("SADD", p, ele) 
    redis.call("SADD", u, ele) 
    return ele 
else 
    return "EXISTS" 
end 

回答

1

你可以用Lua中做到這一點,但只有Redis的V3.2或以上,因爲SPOP是一個非確定性的命令。要做到這一點的方法是使用command replication mode像這樣:可應用於多個鍵彈出

redis.replicate_commands() 
local ele = redis.call('SPOP', KEYS[1]) 
redis.call('SADD', KEYS[2], ele) 

同樣的道理,例如:

redis.replicate_commands() 
local elems = {} 
local target = table.remove(KEYS, 1) 
while #KEYS do 
    local key = table.remove(KEYS, 1) 
    elems[#elems+1] = redis.call('SPOP', key) 
end 
redis.call('SADD', target, unpack(elems)) 
+0

多少開銷是有調用LUA腳本與計劃舊的Redis命令?它有意義嗎? – Blankman

+0

你應該自己測試一下,但是一般來說懲罰很低。確保你使用'EVALSHA'。 –

+0

看到我更新的Q,我得到的錯誤'''(錯誤)ERR錯誤運行腳本(調用f_91aac8622d7da23bbbc2354cbbf547755d85f15f):@user_script:1:user_script:1:試圖調用場 'replicate_commands'(一個零值)' '' – Blankman