De Lua, você precisa retornar um Lua Array ou um objeto JSON. 'myTable' soa como um handle que só é válido dentro do interpretador Lua. Esse identificador é limpo diretamente após a chamada, portanto, não será propagado para o cliente.
Editar:uma Tabela/Array Lua simples deve ser suportada. Não tenho certeza do que está acontecendo, sem olhar o script.
Veja também este link SO para algumas informações extras sobre atomicidade de scripts Lua.
Espero ter ajudado, tw
Após editar OP:
Este era o script Lua original do 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
Resposta: Você não pode retornar valores aninhados no valor de retorno de Lua. Como você pode ver em sua função ServiceStack, um script Lua retorna uma lista e uma lista não é aninhada.
Aqui estão duas soluções, aquela com JSON fornece uma pequena sobrecarga (mas pode ser mais fácil ao programar e é nill-safe).
a:Usando 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 também é um formato de serialização muito bom e compacto (nós o usamos muito), e pode ser retornado assim:
a-alt:Usando cmsgpack
return cmsgpack.pack(a)
b:Usando um array simples
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
Isso retorna:
um :
[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"
Como você pode ver, eu coloquei alguns dados fictícios no
HSET
. Eu também posso recomendar este link, algumas informações interessantes lá:intro-to-lua-for-redis-programmers
Uma boa maneira de adicionar valores a um dict Lua pode ser vista aqui:
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