如何在Redis中使用Lua来将可用结果返回给Node.js?

我正在为我的移动应用程序 API 实现的一个模块是通过提交的用户名获取所有未完成的通知。

我使用了一个名为 username:notifications 的列表来存储所有未完成通知的 ID。例如,在我的测试案例中,调用以下代码后,['9','10','11'] 是结果:

lrange username:notifications 0 -1

所以我编写了一个 Lua 脚本来获取 lrange 的每个结果,并调用以下代码:

hgetall notification:id

由于某些原因,Lua 无法将表格 result 以可用状态发送到 Node.js。想知道是否有任何解决方法来处理多个 hgetall 请求并将它们返回给 Node.js。

以下是剩余的代码:

-- @KEYS: "username"
-- @ARGV: username

-- 获取哈希中的所有字段作为字典
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
    return result
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
点赞
用户204011
用户204011

你不能从 Lua 脚本返回一个“字典”,它不是 Redis 的有效类型 (参见 这里)。

你可以像这样做:

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)

在你的 Node 代码中解码 JSON。

2014-09-28 16:15:28