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

时间:2017-04-05 14:27:31

标签: lua redis

我正在尝试生成一个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包含其他2集的引用和我  想要生成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命令的输入。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

不要这样做,否则您将无法迁移到群集。这来自documentation

  

必须在执行前分析所有Redis命令,以确定命令将在哪些键上运行。为了使EVAL成为现实,必须明确传递密钥。这在许多方面都很有用,但尤其要确保Redis Cluster可以将您的请求转发到适当的群集节点。

     

请注意,不会强制执行此规则,以便为用户提供滥用Redis单实例配置的机会,但代价是编写与Redis Cluster不兼容的脚本。

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

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