Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

ServiceStack Redis, como retornar a tabela Lua como lista


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