Redis按照相同的分数排序设置排行榜排名

问题描述 投票:8回答:2

我正在使用Redis排序集来实现我的游戏的排行榜,其中我按降序显示用户排名。我陷入了两个或更多用户具有相同分数的情况。所以在这种情况下,我希望获得得分的用户排名更高。例如,我在Redis中添加以下条目。

127.0.0.1:6379> zadd testing-key 5 a
(integer) 1
127.0.0.1:6379> zadd testing-key 4 b
(integer) 1
127.0.0.1:6379> zadd testing-key 5 c
(integer) 1

当我以相反的顺序查询等级时,我得到了这个

127.0.0.1:6379> zrevrange testing-key 0 10
1) "c"
2) "a"
3) "b"

但就我而言,排名应该是这样的

1) "a"
2) "c"
3) "b"

那么,Redis中是否有任何条款赋予以相同分数首先进入集合的实体更高的优先级?

redis leaderboard sortedset
2个回答
6
投票

如果您的排行榜的分数足够“小”,您可以使用分数和时间戳的组合(例如123.111455234,其中123是分数)。但是,由于Sorted Set得分是双浮点,因此可能会失去精度。

或者,保留两个排序集 - 一个用于每个玩家的排行榜得分,另一个用于每个玩家的得分时间戳,并使用两者来确定顺序。

或者,为排行榜使用单个排序集,将时间戳编码为成员的一部分,并依赖于词典排序。


4
投票

我找到了解决这个问题的方法。在我的情况下,得分是一个整数,所以我把它转换成十进制,并在十进制后添加Long.MAX_VALUE - System.nanoTime()。所以最终得分代码看起来像

double finalScore = score.(Long.MAX_VALUE - System.nanoTime());

因此,首先得分的球员的最终得分将高于第二得分。如果您有更好的解决方案,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.