gpt4 book ai didi

redis - ZREVRANK 'fair' 在REDIS中的排名

转载 作者:IT王子 更新时间:2023-10-29 06:04:55 26 4
gpt4 key购买 nike

当我有一个带分数的排序集时,即使多个项目具有相同的分数,我也希望获得正确的排名。

例如,当有 5 个得分为 1、2、2、2、3 的项目时,我希望这三个中心项目具有相同的排名 (1),而最高分获得排名 0 (使用 ZREVRANGE),最低的获得等级 4。

我发现查询具有相同分数的键的数量是有可能的,有点高效 O(log(N)),但看起来如果我想得到我想要的分数,我必须使用zscan,复杂度为O(N)。

编辑:根据已接受的解决方案添加完整示例

我们的数据集是一个带分数的排序集。例如:a 得分为 1,b、c 和 d 得分为 2,e 得分为 3:

127.0.0.1:6379> zadd aset 1 a
(integer) 1
127.0.0.1:6379> zadd aset 2 b
(integer) 1
127.0.0.1:6379> zadd aset 2 c
(integer) 1
127.0.0.1:6379> zadd aset 2 d
(integer) 1
127.0.0.1:6379> zadd aset 3 e
(integer) 1

ZREVRANK适用于具有独特分数的项目:

127.0.0.1:6379> zrevrank aset a
(integer) 4
127.0.0.1:6379> zrevrank aset e
(integer) 0

但对于那些具有相同分数的项目,它会失败:

127.0.0.1:6379> zrevrank aset b
(integer) 3
127.0.0.1:6379> zrevrank aset c
(integer) 2
127.0.0.1:6379> zrevrank aset d
(integer) 1

为了解决这个问题,首先用 ZSCORE 得到分数:

127.0.0.1:6379> zscore aset c
"2"

其他项得分相同,当然:

127.0.0.1:6379> zscore aset b
"2"
127.0.0.1:6379> zscore aset d
"2"

要获得他们的排名,只需使用 ZCOUNT与分数:

127.0.0.1:6379> zcount aset (2 +inf
(integer) 1

这也适用于那些具有独特分数的项目:

127.0.0.1:6379> zcount aset (1 +inf
(integer) 4
127.0.0.1:6379> zcount aset (3 +inf
(integer) 0

将此编写为原子 lua 脚本作为练习留给读者。

最佳答案

对于得分为 x 的给定项目,您可以使用 ZCOUNT (X +inf) 在 O(log(N)) 时间内确定其排名。

具体如何使用它取决于您的实现细节。

关于redis - ZREVRANK 'fair' 在REDIS中的排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54312310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com