sql >> Base de Datos >  >> NoSQL >> Redis

ServiceStack Redis, cómo devolver la tabla Lua como Lista

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