你如何在Redis中join一个有散列的有序集?

在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 

是否有一个primefaces操作,可以让我得到一些对象的成员的所有哈希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提供了某种primefaces的“连接”types操作,但也许我错了。 上面的方法看起来完全没有效率。

换句话说,我想join所有media:<id>来自someobject:media的有序集合。 这可能吗?

我不认为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) { }); }); 

我的Redis是生锈的,但我想你想使用(混淆命名) SORT命令。 就像是:

 SORT someobject:media BY nosort GET media:* 

我没有使用node_redis,但我认为这转化为这样的事情:

 client.sort([ "someobject:media", "by", "nosort", "get", "media:*" ], (err, res) => // ... }); 

您可以使用一个sorting命令,但是您必须明确指定所有的散列字段名称。 举个例子,这将是:

 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)