Redis对相同得分的排行榜排名进行排序

时间:2018-10-05 06:09:24

标签: redis leaderboard sortedset

我正在使用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中是否有任何规定可以赋予得分最高的实体相同分数的更高优先级?

2 个答案:

答案 0 :(得分:6)

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

或者,保留两个Sorted Sets-一个具有每个玩家的排行榜得分,另一个具有每个玩家的得分时间戳记,并同时使用两者来确定顺序。

或者,对排行榜使用单个排序的集,将时间戳记编码为成员的一部分,并依靠字典顺序。

答案 1 :(得分:4)

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

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

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