2016-07-14 9 views
2

Setup, indem a b cRedis Lua Script auspacken Rückkehr Unterschiedliche Ergebnisse

sadd läuft, wenn ich diesen Code ausführen gegen das Set ein keystoclear1 einen einzigen Wert von "b" in sich hat. keystoclear2 als beide Werte drin.

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

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

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

ich nicht bin: ein lua-Experten, so konnte ich nur hier ein seltsames Verhalten, aber ich würde gerne wissen, was es verursacht.

Ich testete dies sowohl in der Windows- als auch in der Linux-Version von redis, mit redis-cli und dem Stackexchange.redis-Client. Gleiches Verhalten in allen Fällen. Dies ist ein triviales Beispiel, ich möchte eigentlich die Ergebnisse des Entpackens speichern, da ich mehrere Operationen damit durchführen muss.

UPDATE: Ich verstehe das Problem.

table.unpack() only returns the first element

Lua stellt immer die Anzahl der Ergebnisse aus einer Funktion zu den Umständen des Anrufs. Wenn wir eine Funktion als Anweisung aufrufen, verwirft Lua alle seine Ergebnisse. Wenn wir einen Aufruf als Ausdruck verwenden, behält Lua nur das erste Ergebnis. Wir erhalten alle Ergebnisse nur dann, wenn der Aufruf der letzte (oder einzige) Ausdruck in einer Liste von Ausdrücken ist.

Antwort

1

Dieser Fall unterscheidet sich geringfügig von dem, auf den Sie in Ihrem Update verwiesen haben. In diesem Fall unpack (kann) mehrere Elemente zurückgeben, aber Sie speichern nur eine und verwerfen den Rest. Sie können andere Elemente, wenn man local keytoclear1, keytoclear2 = ... verwenden, aber es ist viel einfacher, die Tabelle selbst zu speichern und entpacken nach Bedarf:

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

Solange unpack der letzte Parameter ist, werden Sie alle Elemente erhalten, die in der zu entpackenden Tabelle vorhanden.

+0

versuchen Sie es mit 'redis.call ('sadd', 'keystoclear1', (entpacken (keystoclear))) – moteus

+0

@moteus, das wird Ihnen nur das erste Element in' keystoclear' geben, was das OP jetzt hat . –