Luaから、Lua配列またはJSONオブジェクトを返す必要があります。 「myTable」は、Luaインタープリター内でのみ有効なハンドルのように聞こえます。そのハンドルは呼び出しの直後にクリーンアップされるため、クライアントに伝達されません。
編集:単純なLuaテーブル/配列がサポートされている必要があります。スクリプトを見ずに、そのとき何が起こっているのかわからない。
Luaスクリプトのアトミック性に関する追加情報については、このSOリンクも参照してください。
これがお役に立てば幸いです、TW
OPの編集後:
これはOPの元のLuaスクリプトでした:
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
回答: Luaの戻り値でネストされた値を返すことはできません。 ServiceStack関数からわかるように、Luaスクリプトはリストを返し、リストはネストされていません。
ここに2つの解決策があります。1つはJSONを使用するとわずかなオーバーヘッドが発生します(ただし、プログラミングの場合は簡単で、安全ではありません)。
a: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も非常に優れたコンパクトなシリアル化形式であり(私たちはこれを頻繁に使用します)、次のように返すことができます:
a-alt:cmsgpackの使用
return cmsgpack.pack(a)
b:単純な配列を使用する
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
これは次を返します:
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"
ご覧のとおり、HSET
にダミーデータを入れました 。
このリンクをお勧めすることもできます。そこにいくつかの素晴らしい情報があります:intro-to-lua-for-redis-programmers
Lua dictに値を追加する良い方法は、ここで見ることができます:
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