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

ank*_*hen 9 leaderboard sortedset redis

我正在使用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
Run Code Online (Sandbox Code Playgroud)

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

127.0.0.1:6379> zrevrange testing-key 0 10
1) "c"
2) "a"
3) "b"
Run Code Online (Sandbox Code Playgroud)

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

1) "a"
2) "c"
3) "b"
Run Code Online (Sandbox Code Playgroud)

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

Ita*_*ber 7

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

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

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


ank*_*hen 5

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

double finalScore = score.(Long.MAX_VALUE - System.nanoTime());
Run Code Online (Sandbox Code Playgroud)

因此,第一个得分的玩家的最终得分将高于第二个得分。如果您有更好的解决方案,请告诉我。

  • 但这不是我在第一段中回答的(也许是简洁的,但希望不是不准确的,当然也只是出于最佳意图)? (2认同)