Redis
 sql >> Datenbank >  >> NoSQL >> Redis

ServiceStack Redis, wie man die Lua-Tabelle als Liste zurückgibt

Von Lua müssen Sie ein Lua-Array oder ein JSON-Objekt zurückgeben. 'myTable' klingt wie ein Handle, das nur innerhalb des Lua-Interpreters gültig ist. Dieses Handle wird direkt nach dem Aufruf bereinigt, wird also nicht an den Client weitergegeben.

Bearbeiten:Eine einfache Lua-Tabelle/Array sollte unterstützt werden. Ich bin mir nicht sicher, was dann los ist, ohne mir das Skript anzusehen.

Siehe auch diesen SO-Link für zusätzliche Informationen über die Atomarität von Lua-Skripten.

Hoffe das hilft, TW

Nach OP bearbeiten:

Dies war das ursprüngliche Lua-Skript des 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

Antwort: Sie können keine verschachtelten Werte im Lua-Rückgabewert zurückgeben. Wie Sie Ihrer ServiceStack-Funktion entnehmen können, gibt ein Lua-Skript eine Liste zurück, und eine Liste ist nicht verschachtelt.

Hier sind zwei Lösungen, die mit JSON verursacht einen leichten Overhead (ist aber beim Programmieren möglicherweise einfacher und nicht sicher).

a:Verwendung von 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 ist auch ein sehr schönes und kompaktes Serialisierungsformat (wir verwenden es häufig) und kann so zurückgegeben werden:

a-alt:Verwenden von cmsgpack

return cmsgpack.pack(a)

b:Verwenden eines einfachen Arrays

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

Dies gibt zurück:

ein :

[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"

Wie Sie sehen können, habe ich einige Dummy-Daten in HSET eingefügt .

Ich kann auch diesen Link empfehlen, da sind ein paar nette Infos drin:intro-to-lua-for-redis-programmers

Eine nette Möglichkeit, einem Lua-Diktat Werte hinzuzufügen, ist hier zu sehen :

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