如何将 SMEMBERS 的结果用作 Lua 脚本中 SUNION 的输入

我正在尝试编写一个 Lua 脚本,该脚本接受集合的成员(每个成员也代表一个集合),并返回这些集合的并集。 这是一个具体的例子,这里有 3 个集合:

smembers u:1:skt:n1
1) "s2"
2) "s3"
3) "s1"

smembers u:1:skt:n2
1) "s4"
2) "s5"
3) "s6"

smembers u:1:skts
1) "u:1:skt:n1"
2) "u:1:skt:n2"

因此,集合 u:1:skts 包含了其他两个集合的参考,并且我想要生成 u:1:skt:n1u:1:skt:n2 的并集,如下所示:

1) "s1"
2) "s2"
3) "s3"
4) "s4"
5) "s5"
6) "s6"

这是我目前的代码:

local indexes = redis.call("smembers", KEYS[1])
return redis.call("sunion", indexes)

但我收到以下错误:

(error) ERR Error running script (call to f_c4d338bdf036fbb9f77e5ea42880dc185d57ede4):
@user_script:1: @user_script: 1: Lua redis() command arguments must be strings or integers

看起来它不喜欢 indexes 变量作为 sunion 命令的输入。 有什么想法吗?

点赞
用户3160475
用户3160475

不要这样做,否则你会在集群中迁移时遇到问题。这是来自文档中的描述:

执行 Redis 命令前必须分析一下哪些键上面的操作已执行。为了能使这一点适用于 EVAL 命令,必须显式传递键。这一点有许多用处,特别是确保 Redis 集群能将请求转发到适当的集群节点上。

注意,这一规则并没有严格执行,这是为了为用户提供滥用 Redis 单个实例配置的机会,但写出的脚本可能无法与 Redis 集群兼容。

如果你仍然决定违反规则,请使用 Lua 的 unpack

local indexes = redis.call("smembers", KEYS[1])
return redis.call("sunion", unpack(indexes))
2017-04-05 15:03:01