如何在redis中使用lua将可用结果返回给nodejs

时间:2014-09-28 05:59:23

标签: node.js lua redis node-redis

我为我的移动应用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

1 个答案:

答案 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解码。