Von Lua müssen Sie ein Lua-Array oder ein JSON-Objekt zurückgeben. 'myTable' klingt wie ein Handle, das nur innerhalb des Lua-Interpreters gültig ist. Dieses Handle wird direkt nach dem Aufruf bereinigt, wird also nicht an den Client weitergegeben.
Bearbeiten:Eine einfache Lua-Tabelle/Array sollte unterstützt werden. Ich bin mir nicht sicher, was dann los ist, ohne mir das Skript anzusehen.
Siehe auch diesen SO-Link für zusätzliche Informationen über die Atomarität von Lua-Skripten.
Hoffe das hilft, TW
Nach OP bearbeiten:
Dies war das ursprüngliche Lua-Skript des OP:
local a={}
for i = 1, 1, 1 do
a["47700415"] = redis.call('hget', 'asr:47700415', 'MDEngines')
a["47700415_000"] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
end
return a
Antwort: Sie können keine verschachtelten Werte im Lua-Rückgabewert zurückgeben. Wie Sie Ihrer ServiceStack-Funktion entnehmen können, gibt ein Lua-Skript eine Liste zurück, und eine Liste ist nicht verschachtelt.
Hier sind zwei Lösungen, die mit JSON verursacht einen leichten Overhead (ist aber beim Programmieren möglicherweise einfacher und nicht sicher).
a:Verwendung von cjson
local a={}
for i = 1, 1, 1 do
a["47700415"] = redis.call('hget', 'asr:47700415', 'MDEngines')
a["47700415_000"] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
end
return cjson.encode(a)
MsgPack ist auch ein sehr schönes und kompaktes Serialisierungsformat (wir verwenden es häufig) und kann so zurückgegeben werden:
a-alt:Verwenden von cmsgpack
return cmsgpack.pack(a)
b:Verwenden eines einfachen Arrays
local a={}
for i = 1, 1, 1 do
a[1] = "47700415"
a[2] = redis.call('hget', 'asr:47700415', 'MDEngines')
a[3] = "47700415_000"
a[4] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
end
return a
Dies gibt zurück:
ein :
[email protected]:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest.lua)" 0 0
"{\"47700415\":\"Hello\",\"47700415_000\":\"World\"}"
b :
[email protected]:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest2.lua)" 0 0
1) "47700415"
2) "Hello"
3) "47700415_000"
4) "World"
Wie Sie sehen können, habe ich einige Dummy-Daten in HSET
eingefügt .
Ich kann auch diesen Link empfehlen, da sind ein paar nette Infos drin:intro-to-lua-for-redis-programmers
Eine nette Möglichkeit, einem Lua-Diktat Werte hinzuzufügen, ist hier zu sehen :
local fkeys = redis.call('sinter', unpack(KEYS))
local r = {}
for i, key in ipairs(fkeys) do
r[#r+1] = redis.call('hgetall',key)
end
return r