От Lua трябва да върнете Lua Array или JSON обект. 'myTable' звучи като манипулатор, който е валиден само в интерпретатора на Lua. Този манипулатор се почиства непосредствено след обаждането, така че няма да се разпространява на клиента.
Редактиране:трябва да се поддържа проста таблица/масив Lua. Не знам какво се случва тогава, без да гледам сценария.
Вижте също тази SO връзка за допълнителна информация относно атомарността на скриптовете на Lua.
Надявам се това да помогне, TW
След редактиране на ОП:
Това беше оригиналният Lua скрипт на 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
Отговор: Не можете да върнете вложени стойности в връщаната стойност на Lua. Както можете да видите от вашата функция ServiceStack, Lua скрипт връща списък и списъкът не е вложен.
Ето две решения, едното с 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
Това връща:
а :
[email protected]:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest.lua)" 0 0
"{\"47700415\":\"Hello\",\"47700415_000\":\"World\"}"
б :
[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