Desde Lua, debe devolver un Lua Array o un objeto JSON. 'myTable' suena como un identificador que solo es válido dentro del intérprete de Lua. Ese identificador se limpia directamente después de la llamada, por lo que no se propagará al cliente.
Editar:debe admitirse una tabla/matriz Lua simple. No estoy seguro de lo que está pasando entonces, sin mirar el guión.
Consulte también este enlace SO para obtener información adicional sobre la atomicidad de los scripts de Lua.
Espero que esto ayude, TW
Después de editar OP:
Este era el script Lua original del 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
Respuesta: No puede devolver valores anidados en el valor devuelto de Lua. Como puede ver en su función ServiceStack, un script de Lua devuelve una lista y una lista no está anidada.
Aquí hay dos soluciones, la que tiene JSON genera una ligera sobrecarga (pero podría ser más fácil al programar y no es segura).
a:Uso de 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 también es un formato de serialización muy bueno y compacto (lo usamos mucho), y se puede devolver así:
a-alt:uso de cmsgpack
return cmsgpack.pack(a)
b:Usar una matriz simple
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
Esto devuelve:
un :
[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 puede ver, puse algunos datos ficticios en el HSET
.
También puedo recomendar este enlace, hay buena información allí:intro-to-lua-for-redis-programmers
Aquí se puede ver una buena manera de agregar valores a un dictado Lua:
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