Redis排序集排行榜同分排名

Redis sorted set leader board ranking on same score

我正在使用 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中有没有规定,对于先进入集合且得分相同的实体给予更高的优先级?

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

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

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

我找到了解决这个问题的方法。在我的例子中,分数是一个整数,所以我将它转换为小数并在小数后添加 Long.MAX_VALUE - System.nanoTime()。所以最终的分数代码会像

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

所以第一个得分的选手的最终得分会比第二个得分高。如果您有更好的解决方案,请告诉我。