从 Lua 中,您需要返回一个 Lua 数组,或者一个 JSON 对象。 'myTable' 听起来像是一个只在 Lua 解释器内部有效的句柄。该句柄在调用后立即被清除,因此不会传播到客户端。
编辑:一个简单的 Lua 表/数组应该是支持的 http://redis.io/commands/eval。不看剧本就不知道发生了什么。
另请参阅此SOlink https://stackoverflow.com/questions/21718277/is-it-possible-to-call-lua-functions-defined-in-other-lua-scripts-in-redis/21921721#21921721有关 Lua 脚本原子性的一些额外信息。
希望这有帮助,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
Answer:您不能在 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 http://msgpack.org/也是一种非常漂亮且紧凑的序列化格式(我们经常使用它),并且可以像这样返回:
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:
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
.
我还可以推荐这个链接,其中有一些不错的信息:Redis 程序员的 lua 简介 http://www.redisgreen.net/blog/2013/03/18/intro-to-lua-for-redis-programmers/
可以看到一种向 Lua 字典添加值的好方法here https://stackoverflow.com/questions/6399730/efficient-index-type-operations-in-redis?rq=1 :
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