通过运行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只保留第一个结果。只有当调用是表达式列表中的最后一个(或唯一的)表达式时,我们才能得到所有结果。
答案 0 :(得分:1)
此案例与您在更新中引用的案例略有不同。在这种情况下,unpack
(可能)返回多个元素,但您只存储一个元素并丢弃其余元素。如果使用local keytoclear1, keytoclear2 = ...
,您可以获得其他元素,但是更容易存储表本身并根据需要解压缩它:
local keystoclear = redis.call('smembers', KEYS[1])
redis.call('sadd', 'keystoclear1', unpack(keystoclear))
只要unpack
是最后一个参数,您就会获得正在解压缩的表中存在的所有元素。