sql >> Databasteknik >  >> NoSQL >> Redis

ServiceStack Redis, hur man returnerar Lua-tabellen som lista

Från Lua måste du returnera en Lua Array eller ett JSON-objekt. 'myTable' låter som ett handtag som bara är giltigt i Lua-tolken. Det handtaget rensas upp direkt efter samtalet, så det kommer inte att spridas till klienten.

Redigera:en enkel Lua-tabell/array bör stödjas. Inte säker på vad som händer då, utan att titta på manuset.

Se även denna SO-länk för lite extra information om atomiciteten hos Lua-skript.

Hoppas detta hjälper, TW

Efter redigering OP:

Detta var OP:s ursprungliga Lua-manus:

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

Svar: Du kan inte returnera kapslade värden i Lua-returvärdet. Som du kan se från din ServiceStack-funktion returnerar ett Lua-skript en lista och en lista är inte kapslad.

Här är två lösningar, den med JSON ger lite overhead (men kan vara lättare vid programmering och är nollsäker).

a:Använder 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 är också ett mycket trevligt och kompakt serialiseringsformat (vi använder det mycket), och kan returneras så här:

a-alt:Använder cmsgpack

return cmsgpack.pack(a)

b:Använda en enkel 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

Detta returnerar:

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"

Som du kan se lägger jag in lite dummydata i HSET .

Jag kan också rekommendera den här länken, lite trevlig info där:intro-to-lua-for-redis-programmers

Ett trevligt sätt att lägga till värden till en Lua dict kan ses här :

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. Kör redis på nodejs Docker-bild

  2. explain() i Mongodb:skillnader mellan nscanned och nscannedObjects

  3. Varför använder inte MongoDB index-korsning?

  4. Spring Data MongoDB och Bulk Update