Redis
 sql >> Database >  >> NoSQL >> Redis

ServiceStack Redis, come restituire la tabella Lua come List

Da Lua, devi restituire un Lua Array o un oggetto JSON. 'myTable' suona come un handle valido solo all'interno dell'interprete Lua. Tale handle viene ripulito direttamente dopo la chiamata, quindi non verrà propagato al client.

Modifica:dovrebbe essere supportata una semplice tabella/array Lua. Non sono sicuro di cosa stia succedendo, senza guardare il copione.

Vedi anche questo collegamento SO per alcune informazioni extra sull'atomicità degli script Lua.

Spero che questo aiuti, TW

Dopo la modifica dell'OP:

Questo era lo script Lua originale dell'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

Risposta: Non è possibile restituire valori nidificati nel valore restituito Lua. Come puoi vedere dalla tua funzione ServiceStack, uno script Lua restituisce un elenco e un elenco non è nidificato.

Ecco due soluzioni, quella con JSON offre un leggero sovraccarico (ma potrebbe essere più semplice durante la programmazione ed è a prova di zero).

a:Utilizzo di 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 è anche un formato di serializzazione molto carino e compatto (lo usiamo molto) e può essere restituito in questo modo:

a-alt:utilizzo di cmsgpack

return cmsgpack.pack(a)

b:utilizzo di un semplice array

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

Questo restituisce:

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"

Come puoi vedere, ho inserito alcuni dati fittizi in HSET .

Posso anche consigliare questo link, alcune belle informazioni lì dentro:intro-to-lua-for-redis-programmers

Un bel modo per aggiungere valori a un dict Lua può essere visto qui:

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