Redis Lua脚本解包返回不同的结果

时间:2016-07-14 21:41:10

标签: lua redis

通过运行sadd a b c进行设置

当我对set a执行此代码时 keystoclear1的单个值为" b"在里面。 keystoclear2作为其中的两个值。

local keystoclear = unpack(redis.call('smembers', KEYS[1]))

redis.call('sadd', 'keystoclear1', keystoclear)

redis.call('sadd', 'keystoclear2', unpack(redis.call('smembers', KEYS[1])))

我绝不是lua专家,所以我可以在这里有一些奇怪的行为,但我想知道是什么导致它。

我使用redis-cli和stackexchange.redis客户端在windows和linux版本的redis上测试了这个。在所有情况下都行为相同。这是一个简单的例子,我实际上想存储解压缩的结果,因为我需要用它执行几个操作。

更新:我理解这个问题。

table.unpack() only returns the first element

  

Lua总是将函数的结果数量调整为调用的情况。当我们将函数称为语句时,Lua会丢弃其所有结果。当我们使用调用作为表达式时,Lua只保留第一个结果。只有当调用是表达式列表中的最后一个(或唯一的)表达式时,我们才能得到所有结果。

1 个答案:

答案 0 :(得分:1)

此案例与您在更新中引用的案例略有不同。在这种情况下,unpack(可能)返回多个元素,但您只存储一个元素并丢弃其余元素。如果使用local keytoclear1, keytoclear2 = ...,您可以获得其他元素,但是更容易存储表本身并根据需要解压缩它:

local keystoclear = redis.call('smembers', KEYS[1])
redis.call('sadd', 'keystoclear1', unpack(keystoclear))

只要unpack是最后一个参数,您就会获得正在解压缩的表中存在的所有元素。