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

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

我以为答复将采用数组形式是否正确?我意识到redis api会返回“多批答复”,但这到底是什么意思,如果它不是数组,我将如何使用它?

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

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

分数和成员是数组。

编辑:

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

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

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

就是说,如果我在时间1346276537收到陷阱“RGB色域错误(---- Bb)”,并将其存储在Current中,那么我还将精确的得分和成员存储在单独的集合中,并使用键“IPAddress:RGB Gamut Error”。

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

旁注:我的成员实际上在末尾添加了两个数字,以使每个成员唯一且不会相互覆盖。这确实是唯一的目的。

例如:IPAdress::RGB色域误差(Rr–Bb):5:46

最佳答案



是的,node_redis将给您一个zrange作为数组的答复。



不可以。在redis 2.4之前,您一次只能发送一个参数(所以zadd key score member)。从redis 2.4开始,zadd(以及许多其他命令)是可变的,即它们接受任意数量的参数-但不能作为数组。您仍然必须这样称呼它:

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);

关于node.js - 接收来自Redis ZRANGE的回复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12166698/

10-10 18:00