你如何在Redis中加入带有哈希值的有序集合?

时间:2015-09-20 21:35:23

标签: node.js redis

在Redis中,我说有一组有序的ID(按时间戳评分):

(name of ordered set) someobject:media

Member | Score
1        1442784376400
2        1442784376420
3        1442784376450

每个成员都是哈希的ID(如下所示):

media:1      { 'name': 'something', 'timestamp': '1442784376400 }
media:2      { 'name': 'somethingelse', 'timestamp': '1442784376420' }
// and so forth

是否存在允许我为someobject:media成员获取所有哈希值的原子操作?

我正在使用Node Redis,理论上它提供了redis-cli提供的所有操作(正如人们所期望的那样)。

到目前为止,我唯一的想法就是遍历所有内容,例如:

client.zrevrange(['someobject:media', 0, -1], (err, res) => {
  let promises = res.map(mediaId => {
    return new Promise((resolve, reject) => {
      client.hgetall('media:' + mediaId, (err, res) => {
        resolve(res);
      });
    });
  });

  Promise.all(promises).then(result => {
    // do something with the "media" hashes
  });
});

我的直觉告诉我Redis提供了某种原子“连接”类型的操作,但也许我错了。上述方法看起来效率很低。

换句话说,我想加入有序的media:<id>集中的所有someobject:media。这可能吗?

2 个答案:

答案 0 :(得分:2)

我认为sort不适用于哈希。您可以使用multi模式,它仍然有效。 Multi在redis中比在join中更典型。像这样:

client.zrange("members", 0, 100, function (err, replies) {
     var m = client.multi()
     replies.forEach(function(item) {
         m.hgetall(item);
     });
     m.exec(function(err, hashes) {

     });
});

答案 1 :(得分:0)

您可以使用一个排序命令,但必须显式指定所有哈希字段名称。对于您的示例,它将是:

sort someobject:media get media:*->name get media:*->time
1) "something"
2) "1442784376400"
3) "somethingelse"
4) "1442784376420"
5) (nil)
6) (nil)

为了便于阅读答案,您可以添加get #以获取索引:

sort someobject:media get # get media:*->name get media:*->time
1) "1"
2) "something"
3) "1442784376400"
4) "2"
5) "somethingelse"
6) "1442784376420"
7) "3"
8) (nil)
9) (nil)