我为我的移动应用api实施的模块之一是从提交所有未完成的通知中提交用户名。
我使用了一个名为username:notifications的列表来存储所有未完成的通知ID。 例如,在我的测试用例中,['9','10',11']是调用后的结果
lrange username:notifications 0 -1
所以我写了一个lua脚本来获得lrange和每个结果,
hgetall notification:id
由于某种原因,lua无法将表,结果发送到处于可用状态的nodejs。想知道是否有人 有多个hgetall请求的解决方案,并将它们返回到nodejs
以下是代码的其余部分: - @KEYS:“用户名” - @ARGV:用户名
-- gets all fields from a hash as a dictionary
local hgetall = function (key)
local bulk = redis.call('HGETALL', key)
local result = {}
local nextkey
for i, v in ipairs(bulk) do
if i % 2 == 1 then
nextkey = v
else
result[nextkey] = v
end
end
end
local result = {}
local fields = redis.call('LRANGE' , ARGV[1], 0,-1)
for i, field in ipairs(fields) do
result[field] = hgetall('notification:'..field)
end
return result
答案 0 :(得分:1)
您无法从Lua脚本返回“词典”,它不是有效的Redis类型(请参阅here)。
你可以做的事情是这样的:
local result = {}
local fields = redis.call('LRANGE' , ARGV[1], 0, -1)
for i=1,#fields do
local t = hgetall('notification:' .. fields[i])
result[#result+1] = fields[i]
result[#result+1] = #t/2
for j=1,#t do
result[#result+1] = t[j]
end
end
return result
结果是一个简单的列表,格式为:
[ field_1, nb_pairs_1, pairs..., field_2, nb_pairs_2, ... ]
您需要在Node程序中对其进行解码。
编辑:还有另一个解决方案,在您的情况下可能更简单:在JSON中编码结果并将其作为字符串返回。
只需将代码的最后一行替换为:
return cjson.encode(result)
并在您的节点代码中从JSON解码。