如何从一个集合SPOP和使用lua的SADD到另一个集合

时间:2017-03-06 03:13:54

标签: redis

我有一个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

1 个答案:

答案 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))