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

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

  1. 从“源”集合中 SPOP 1 个或多个项
  2. 将 #1 中的元素添加到“目标”集合中

我使用的是 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 个元素,则不会尝试添加到目标集合中。
点赞
用户3160475
用户3160475

在 Redis v5 及以上版本中,由于默认将脚本效果作为复制,因此应该“正常工作”。在 v4 中,您需要在脚本中的任何随机命令之前执行 redis.replicate_commands()

编辑:根据您的编辑和评论,以下是一个示例:

-- 取消注释下面一行以适用于 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")
2018-11-07 16:57:18