我有一个SET,其中包含我想要执行服务器端处理的密钥。
我想要SPOP和item,然后还要SADD到另一组。
所以我将有以下两套:
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
答案 0 :(得分: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))