sql >> Database >  >> NoSQL >> Redis

ServiceStack Redis, hoe de Lua-tabel als lijst te retourneren

Van Lua moet u een Lua Array of een JSON-object retourneren. 'myTable' klinkt als een handvat dat alleen geldig is in de Lua-interpreter. Die handle wordt direct na het gesprek opgeruimd en wordt dus niet doorgegeven aan de klant.

Bewerken:een eenvoudige Lua Table/Array zou ondersteund moeten worden. Ik weet niet zeker wat er dan aan de hand is, zonder naar het script te kijken.

Zie ook deze SO-link voor wat extra info over de atomiciteit van Lua-scripts.

Ik hoop dat dit helpt, TW

Na bewerking OP:

Dit was het originele Lua-script van de 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

Antwoord: U kunt geen geneste waarden retourneren in de Lua-retourwaarde. Zoals je kunt zien aan je ServiceStack-functie, retourneert een Lua-script een lijst en is een lijst niet genest.

Hier zijn twee oplossingen, die met JSON geeft een lichte overhead (maar is misschien gemakkelijker bij het programmeren en is niet veilig).

a:cjson gebruiken

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 is ook een erg mooi en compact serialisatieformaat (we gebruiken het veel) en kan als volgt worden geretourneerd:

a-alt:cmsgpack gebruiken

return cmsgpack.pack(a)

b:Een eenvoudige array gebruiken

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

Dit geeft als resultaat:

een :

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

Zoals je kunt zien, heb ik wat dummy-gegevens in de HSET gezet .

Ik kan ook deze link aanbevelen, daar staat wat leuke info in:intro-to-lua-for-redis-programmers

Een leuke manier om waarden toe te voegen aan een Lua-dictaat is hier te zien:

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



  1. MongoDB, prestatie van query door reguliere expressie op geïndexeerde velden

  2. Redis/Jedis - Verwijderen op patroon?

  3. Azure Redis cache - meerdere fouten TimeoutException:time-out bij het uitvoeren van GET {key}

  4. Top 5 voordelen van gedeelde MongoDB-hosting