从Lua,您需要返回Lua数组或JSON对象。“ myTable”听起来像一个仅在Lua解释器内部有效的句柄。该句柄将在调用后立即清理,因此不会传播到客户端。
编辑:应该 支持一个简单的Lua表/数组。不知道接下来发生了什么,而无需查看脚本。
另请参见此SO 链接,以获取有关Lua脚本原子性的一些额外信息。
希望这会有所帮助,TW
这是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脚本返回一个列表,并且列表没有嵌套。
这里有两种解决方案,一种采用JSON的解决方案会产生少量开销(但编程时可能会更容易,而且非常安全)。
答:使用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
返回:
一 :
tw@srv-flux-02:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest.lua)" 0 0
"{\"47700415\":\"Hello\",\"47700415_000\":\"World\"}"
b :
tw@srv-flux-02:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest2.lua)" 0 0
1) "47700415"
2) "Hello"
3) "47700415_000"
4) "World"
如您所见,我在中放入了一些虚拟数据HSET
。
我也可以推荐此链接,那里有一些不错的信息:lua-for-redis- programmers简介
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