社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Redis

zrevrank在redis中的“公平”排名

Jan • 6 年前 • 1671 次点击  

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

例如,当有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脚本留给读者作为练习。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30832
 
1671 次点击  
文章 [ 2 ]  |  最新文章 6 年前