Fra Lua skal du returnere et Lua Array eller et JSON-objekt. 'myTable' lyder som et håndtag, der kun er gyldigt inde i Lua-tolken. Det håndtag ryddes op direkte efter opkaldet, så det spredes ikke til klienten.
Rediger:en simpel Lua Table/Array bør understøttes. Ikke sikker på, hvad der sker, uden at se på manuskriptet.
Se også dette SO-link for lidt ekstra info om atomiciteten af Lua-scripts.
Håber dette hjælper, TW
Efter redigering OP:
Dette var OP's originale Lua-script:
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 ikke returnere indlejrede værdier i Lua-returværdien. Som du kan se fra din ServiceStack-funktion, returnerer et Lua-script en liste, og en liste er ikke indlejret.
Her er to løsninger, den med JSON giver lidt overhead (men kan være nemmere ved programmering og er nul-sikker).
a:Brug af 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 er også et meget flot og kompakt serialiseringsformat (vi bruger det meget), og kan returneres sådan her:
a-alt:Brug af cmsgpack
return cmsgpack.pack(a)
b:Brug af en simpel matrix
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
Dette returnerer:
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, har jeg lagt nogle dummy-data i HSET
.
Jeg kan også anbefale dette link, nogle gode oplysninger derinde:intro-to-lua-for-redis-programmers
En god måde at tilføje værdier til en Lua dict kan ses her :
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