如何在lua脚本中从一个列表和SADD SPOP到另一个列表



我想在redis-LUA脚本中执行以下操作:

  1. "源"集合中的SPOP 1+项目
  2. 从#1到"目标"集合的SADD元素

我使用的是redis 5。

我有下面的lua,但这只是一个元素:

local source = KEYS[1]
local target = KEYS[2]
local num    = KEYS[3]
local ele = redis.call("SPOP", "source")
redis.call("SADD", target, ele)
return "OK"

我如何用更新以上内容

  1. 使用传入的参数KEY[3]处理1个以上元素
  2. 确保如果从POP返回了0个元素,则不会尝试将其添加到目标集

在Redis v5及更高版本中,由于默认情况下转移到脚本效果复制,这应该"正常工作"。

在v4中,您必须在脚本中的任何随机命令之前执行redis.replicate_commands()

编辑:根据您的编辑和评论,这里有一个例子:

-- uncomment the next line for Redis v4
-- redis.replicate_commands()

local source = KEYS[1]
local target = KEYS[2]
local num    = ARGV[1]
local elems = redis.call("SPOP", source, num)
if #elems > 0 then
redis.call("SADD", target, unpack(elems))
end
return redis.status_reply("OK")  

最新更新