收到Redis ZRANGE的回复

时间:2012-08-28 20:01:41

标签: node.js redis

我目前有两个排序集,我试图从一个集合中获取所有分数和成员,并使用它从另一个集合中删除成员。我使用的模块是node_redis。

现在我正试图通过调用client.zrange()并将回复存储在数组中来获取成员和分数。

假设答案是数组形式,我是否正确?我意识到redis api说它返回了一个“多批量回复”,但这究竟是什么意思,如果它不是一个数组,我将如何使用它呢?

我还有另一个问题,那就是我可以在使用zadd()时使用数组吗? 一个例子是这样的。

client.zadd(historyKey, scores, members, function(err, reply){});

分数和成员是数组。

编辑:

我正在处理接收和解析SNMP陷阱。基本上我收到一个陷阱并检查其警报类型。这些陷阱中的有用信息是警报类型和完整陷阱名称。我检查警报是否为0,1或2.

如果它是1,那么我在收到它的unix时间将它存储在我的当前有序集中。如果它是0或2我知道那种类型的警报已经完成,我需要从当前集中删除所有类似的陷阱,并将它们与我刚收到的那个一起放入历史记录集。

为了从Current中删除陷阱并将它们放入历史记录中,我必须为每个陷阱创建一个单独的集合,以便跟踪它们在当前集合中的位置。

即如果我在时间1346276537收到陷阱“RGB色域错误(---- Bb)”并将其存储在Current中,我还将精确得分和成员存储在一个单独的集合中,其中包含密钥“IPAddress:RGB Gamut错误”。

当我收到名为“RGB Gamut Error”的警报类型0或2时,我可以将IP地址附加到其前面,在该集合上执行zrange,然后添加到历史记录和从当前删除。最后删除“IPAddress:RGB Gamut Error”设置,以便我可以重新开始。

旁注:我的成员实际上有两个数字添加到最后,以使每个成员唯一,而不是相互覆盖。这真的只有目的。

Ex:IPAdress :: RGB色域错误(Rr - Bb):5:46

1 个答案:

答案 0 :(得分:1)

  

我认为回复是数组形式的吗?

是的,node_redis会以zrange作为数组给您回复。

  

我还有另一个问题,那就是我在使用zadd()时可以使用数组吗?一个例子是这样的。

没有。在redis 2.4之前,您一次只能发送一个参数(所以zadd key score member)。由于redis 2.4,zadd(以及许多其他命令)是 variadic ,即它们接受任意数量的参数 - 但不是数组。你仍然需要这样称呼它:

client.zadd(key, score1, member1, score2, member2, ..., function(err, reply){});

你可以做一些.apply技巧,但你必须先将scoresmembers数组压缩成一个数组。

<强>更新

如果您已经拥有scoresmembers数组,则可以将它们合并为一个数组:

var scores = [1, 2, 3],
    members = ['a', 'b', 'c'];

function merge (other) {
  return function (result, current, index) {
    result.push(current, other[index]);
    return result;
  }
}

var merged = scores.reduce(merge(members), []);

// Now merged = [1, 'a', 2, 'b', 3, 'c'];

var args = [key].concat(merged).concat(function(err, reply){});

client.zadd.apply(client, args);