2016-08-16 4 views
0

Ich habe folgende Redis LUA-Skript:Redis LUA-Skript bedingte Kommissionierung falsch return-Anweisung

eval "if redis.call('ZSCORE', KEYS[1], ARGV[1]) == nil then return 'true' else return 'false' end" 1 stats test 

Im Gegenzug habe ich immer 'false' erhalten, obwohl das folgende Kommando gibt nil zurück:

zscore stats test 

Ergebnis:

(nil) 

Das erwartete Ergebnis des ersten Befehls wäre 'wahr'. Ich habe Schlüssel und Argument des ersten Befehls in zufällige Werte geändert und bekomme immer 'falsch'. Kann mir jemand dabei helfen? Ich benutze Redis 2.8.17.

Antwort

2

Bitte beachten Sie die documentation regarding type conversion, speziell diese Zeile:

  • Redis Nil bulk Antwort und Nil Multi bulk Antwort -> Lua false boolean Typ

Das bedeutet, dass für Ihre Skript, um wie erwartet zu arbeiten, müssen Sie es wie folgt ändern:

eval "if redis.call('ZSCORE', KEYS[1], ARGV[1]) == false then return 'true' else return 'false' end" 1 stats test 

Beachten Sie, dass:

  1. Redis' Protokoll nicht einen Booleschen Typ hat, so dass Sie im Grunde die Saiten Rückkehr ‚true‘ oder ‚falsch‘.
  2. Die Logik unlogisch ist (wenn er falsch ist dann true);)

BTW, obwohl Lua die ternary operator nicht zur Schau tragen, kann es mit dem folgenden Äquivalent simuliert werden:

eval "return redis.call('ZSCORE', KEYS[1], ARGV[1]) and 'false' or 'true'" 1 stats test 
+0

Dank sehr viel! Ich habe diesen Teil in der Spezifikation vermisst. –

Verwandte Themen