2014-09-28 82 views
1

我为我的移动应用程序api实现的一个模块是从提交用户名获取所有未完成的通知。如何在redis中使用lua将可用结果返回给nodejs

我使用了一个名为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

您不能从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, ... ] 

您需要在您的节点计划进行解码。

编辑:还有另一种解决方案,可能在你的情况下更简单:在JSON中编码结果并将其作为字符串返回。

通过只需更换你的代码的最后一行:

return cjson.encode(result) 

和JSON在您的节点代码进行解码。

+0

这个答案在10月3日被接受,然后未被接受的是星期三。它不适合你吗? – catwell 2014-10-14 11:13:28

相关问题