Dari Lua, Anda perlu mengembalikan Array Lua, atau objek JSON. 'myTable' terdengar seperti pegangan yang hanya valid di dalam interpreter Lua. Pegangan itu dibersihkan langsung setelah panggilan, jadi tidak akan disebarkan ke klien.
Sunting:Tabel/Array Lua sederhana harus didukung. Tidak yakin apa yang terjadi, tanpa melihat naskahnya.
Lihat juga tautan SO ini untuk beberapa info tambahan tentang atomisitas skrip Lua.
Semoga membantu, TW
Setelah mengedit OP:
Ini adalah skrip Lua asli 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
Jawaban: Anda tidak dapat mengembalikan nilai bersarang dalam nilai pengembalian Lua. Seperti yang Anda lihat dari fungsi ServiceStack Anda, skrip Lua mengembalikan sebuah daftar, dan sebuah daftar tidak bersarang.
Berikut adalah dua solusi, solusi dengan JSON memberikan sedikit overhead (tetapi mungkin lebih mudah saat memprogram, dan tidak aman).
a:Menggunakan 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 juga merupakan format serialisasi yang sangat bagus dan ringkas (kami sering menggunakannya), dan dapat dikembalikan seperti ini:
a-alt:Menggunakan cmsgpack
return cmsgpack.pack(a)
b:Menggunakan array sederhana
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
Ini mengembalikan:
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"
Seperti yang Anda lihat, saya menaruh beberapa data dummy di HSET
.
Saya juga dapat merekomendasikan tautan ini, beberapa info bagus di sana:intro-to-lua-for-redis-programmers
Cara yang bagus untuk menambahkan nilai ke dict Lua dapat dilihat di sini :
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