Redis
 sql >> Base de données >  >> NoSQL >> Redis

ServiceStack Redis, comment renvoyer la table Lua en tant que liste

Depuis Lua, vous devez renvoyer un tableau Lua ou un objet JSON. 'myTable' sonne comme un handle qui n'est valide qu'à l'intérieur de l'interpréteur Lua. Ce descripteur est nettoyé directement après l'appel, il ne sera donc pas propagé au client.

Modifier :une simple table/tableau Lua devrait être prise en charge. Je ne sais pas ce qui se passe alors, sans regarder le script.

Voir aussi ce lien SO pour des informations supplémentaires sur l'atomicité des scripts Lua.

J'espère que cela vous aidera, TW

Après modification de l'OP :

C'était le script Lua original de l'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

Réponse : Vous ne pouvez pas renvoyer de valeurs imbriquées dans la valeur de retour Lua. Comme vous pouvez le voir à partir de votre fonction ServiceStack, un script Lua renvoie une liste et une liste n'est pas imbriquée.

Voici deux solutions, celle avec JSON donne une légère surcharge (mais peut être plus facile lors de la programmation et est sans danger).

a :Utilisation 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 est également un format de sérialisation très agréable et compact (nous l'utilisons beaucoup), et peut être renvoyé comme ceci :

a-alt :Utilisation de cmsgpack

return cmsgpack.pack(a)

b :Utiliser un tableau 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

Ceci renvoie :

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"

Comme vous pouvez le voir, j'ai mis des données factices dans le HSET .

Je peux également recommander ce lien, qui contient de belles informations :intro-to-lua-for-redis-programmers

Une belle façon d'ajouter des valeurs à un dict Lua peut être vue ici :

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