2014-01-29 11 views
7

ich den Redis TYPE Befehl in einem Lua-Skript zu verwenden ist versucht (über EVAL ausgeführt)Mit dem Befehl TYPE innerhalb eines Redis/Lua Script

local key_type = redis.call("TYPE", key) 

Nach der Redis Dokumentation, das eine Reihe von zurückgeben sollte "none", "zset" usw.

Der Typ des zurückgegebenen Werts ist jedoch ein lua table. Vergleicht man den Wert mit einem String, wird immer false zurückgegeben.

Ich habe in String-Vergleich Befehle zu

durch Änderung der Anruf, um das Problem zu bekommen verwaltet
local key_type = redis.call("TYPE", key)["ok"] 

Dieser Wert ist in der Tat ein String und funktioniert. Ich bin besorgt, dass dies ein Bug in meiner speziellen Version von Redis ist und es in zukünftigen Versionen brechen wird, wenn ich upgrade.

Weiß jemand, ob dies erwartetes Verhalten oder ein Fehler ist?

Antwort

9

Der TYPE Befehl gibt eine Statusantwort (a.k.a einfachen String), z "+list\r\n".

Auf Redis Skriptseite wird call von luaRedisCallCommand implementiert, die den echten Redis-Befehl hinter den Kulissen ausführt.

Nach erfolgreicher Ausführung konvertiert diese Funktion das Befehlsergebnis mit redisProtocolToLuaType.

Wenn eine Statusantwort angetroffen wird, wird diese Funktion erstellt eine Lua-Tabelle mit "ok" als Schlüssel, und der Status Antwort als Wert (siehe redisProtocolToLuaType_Status). Also:

  • gibt es keine Fehler,
  • diesem Grund redis.call("TYPE", key) eine Tabelle ist (und somit müssen Sie den Wert für die "ok" Schlüssel erhalten, wie Sie tat key ‚s-Typ als String zu bekommen) .

Hinweis: Wenn Sie die Tabelle direkt zurückgeben, nimmt Redis Pflege den Wert auf die "ok" Schlüssel zugeordnet zu bekommen, und gibt ihn als Statusantwort, zB:

> EVAL 'return redis.call("TYPE", "foo")' 
set 

dies Siehe code section für mehr Einzelheiten.

+0

Vielen Dank für Ihre ausführliche und sachkundige Antwort. –

Verwandte Themen