在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
。这可能吗?
答案 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)