redis从2个排序集中获得前5名

redis get top 5 from 2 sorted set

我有 2 个排序集作为排名。我想从他们之间的联盟中获得前 5 名。分数相同

zadd rank1 1 aaa
zadd rank1 2 bbb
zadd rank1 3 ccc
zadd rank1 4 ddd
zadd rank2 1 aaa
zadd rank2 2 bbb
zadd rank2 3 ccc
zadd rank2 4 ddd

这样做的最佳方法是什么?

ZUINON 10 rank1 rank2 AGGREGATE MAX 5 

我会假设类似的东西,但 max 5 不存在。

编辑 刚刚发现即使 ZUNION 也无济于事,因为我的 redis 版本是 6.0.5 而不是 6.2.0

这取决于你想用同一个键的分数做什么。对于两个'aaa',要不要把他们相加(聚合)然后得到前五位的聚合结果?

您可以使用 ZUNIONSTORE,可以选择将临时结果存储在其他地方,然后获得前五名的结果。 (支持Redis 6以下版本)

要以原子方式执行此操作,您需要一个 lua 脚本来组合以下两个命令

ZUNIONSTORE out 2 rank1 rank2  --(the temporary result is stored in a zset called 'out')
ZREVRANGE out  0 4   ---- (ranking from highest to lowest, get top five)

my sorted sets are huge - i.e million of keys in each set. plus, this union will happen a lot of times per sec (it is the top query in my site). is this the fastest approach?

只需从每个 SortedSet 中取出前 5 个,然后在您的服务器(/客户端)进程中从这 10 个元素中选择前 5 个。对于您的场景,这将是最快且最不复杂的。

您可以使用 ZREVRANGE 命令从一个 SortedSet 中获取前 N 个元素。但是对于 unify/merge 2xN 个元素并选择前 M 个元素,您还需要这些元素的各自分数。 ZREVRANGE 命令带有 WITHSCORES 关键字 returns 前 N 个元素及其分数。

ZREVRANGE rank1 0 4 WITHSCORES
ZREVRANGE rank2 0 4 WITHSCORES