sql >> Databáze >  >> NoSQL >> Redis

ServiceStack Redis, jak vrátit tabulku Lua jako seznam

Z Lua musíte vrátit pole Lua nebo objekt JSON. 'myTable' zní jako popisovač, který je platný pouze uvnitř tlumočníka Lua. Tento popisovač je vyčištěn přímo po volání, takže nebude přenesen na klienta.

Upravit:Měla by být podporována jednoduchá tabulka/pole Lua. Pak si nejste jisti, co se děje, aniž byste se podívali na skript.

Podívejte se také na tento odkaz SO, kde najdete nějaké další informace o atomičnosti skriptů Lua.

Doufám, že to pomůže, TW

Po úpravě OP:

Toto byl původní Lua skript 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

Odpověď: V návratové hodnotě Lua nelze vrátit vnořené hodnoty. Jak můžete vidět z funkce ServiceStack, skript Lua vrací seznam a seznam není vnořený.

Zde jsou dvě řešení, jedno s JSON poskytuje mírnou režii (ale může být jednodušší při programování a je zcela bezpečné).

a:Použití 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 je také velmi pěkný a kompaktní formát serializace (používáme ho hodně) a lze jej vrátit takto:

a-alt:Použití cmsgpack

return cmsgpack.pack(a)

b:Použití jednoduchého pole

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

Toto vrátí:

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"

Jak můžete vidět, vložil jsem do HSET nějaká fiktivní data .

Mohu také doporučit tento odkaz, je tam pár pěkných informací:intro-to-lua-for-redis-programmers

Pěkný způsob přidávání hodnot do Lua diktátu můžete vidět zde:

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. Importujte data do svých nově vytvořených instancí MongoDB

  2. Jak vytvořit indexy v MongoDB přes .NET

  3. Jak získat den, měsíc a rok z data v SQL

  4. Vlastní prostředí Rails Resque.enqueue nevytváří úlohy