Från Lua måste du returnera en Lua Array eller ett JSON-objekt. 'myTable' låter som ett handtag som bara är giltigt i Lua-tolken. Det handtaget rensas upp direkt efter samtalet, så det kommer inte att spridas till klienten.
Redigera:en enkel Lua-tabell/array bör stödjas. Inte säker på vad som händer då, utan att titta på manuset.
Se även denna SO-länk för lite extra information om atomiciteten hos Lua-skript.
Hoppas detta hjälper, TW
Efter redigering OP:
Detta var OP:s ursprungliga Lua-manus:
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
Svar: Du kan inte returnera kapslade värden i Lua-returvärdet. Som du kan se från din ServiceStack-funktion returnerar ett Lua-skript en lista och en lista är inte kapslad.
Här är två lösningar, den med JSON ger lite overhead (men kan vara lättare vid programmering och är nollsäker).
a:Använder 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 är också ett mycket trevligt och kompakt serialiseringsformat (vi använder det mycket), och kan returneras så här:
a-alt:Använder cmsgpack
return cmsgpack.pack(a)
b:Använda en enkel array
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
Detta returnerar:
a :
[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"
Som du kan se lägger jag in lite dummydata i HSET
.
Jag kan också rekommendera den här länken, lite trevlig info där:intro-to-lua-for-redis-programmers
Ett trevligt sätt att lägga till värden till en Lua dict kan ses här :
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