首页 新闻 会员 周边

redis实时排行榜

0
悬赏园豆:20 [待解决问题]

用redis的zset实现排行榜功能,当分数相同时时间在前的排在前面。使用分数+时间戳的方式可以实现,用这种方式留给分数的可用位数就变小了,只有7位了,分数的大小会有几百万时,redis分数大于17位时会有精度问题,还有别的方式实现吗

15年的夏天的主页 15年的夏天 | 初学一级 | 园豆:47
提问于:2024-01-26 10:32
< >
分享
所有回答(3)
0

时间戳这块可以压缩一下,自定义一种格式

王铮来了 | 园豆:184 (初学一级) | 2024-01-27 16:59
0

确实,在使用 Redis 的 ZSET(有序集合)实现排行榜时,如果使用分数+时间戳的方式,可能会受到位数限制和精度问题的影响。这里有一些其他的方式可以考虑实现实时排行榜:

分数+时间戳+随机数: 为了解决精度问题,可以在分数和时间戳的基础上加上一个随机数,以确保在分数相同时的顺序。例如,可以将分数设计成一个小数,然后再加上时间戳和一部分随机数,以保证排序的唯一性。

python
Copy code
score = 分数 + 时间戳 + 随机数
这样的设计可以一定程度上避免精度问题,并保证相同分数的元素能够按照时间顺序排列。

使用 Redis 的 Lexicographical Range Queries: 通过将分数和时间戳进行字符串拼接,然后将字符串作为 ZSET 的成员存储。这样,可以使用 Redis 的 Lexicographical Range Queries 来进行范围查询,而不仅仅依赖于分数排序。

python
Copy code
member = 分数 + "_" + 时间戳
这样,即使分数相同,Lexicographical Range Queries 也能确保按照时间戳的顺序进行排序。

使用 Redis 的时间戳作为分数: 将时间戳作为 ZSET 的分数,而不是作为成员的一部分。这样可以避免分数长度的问题,而仍然保留了时间的排序。

python
Copy code
ZADD leaderboard 时间戳 用户ID
在这种情况下,相同时间戳的元素将按照用户ID的字典序排列。

选择哪种方式取决于具体的业务需求和对性能的要求。在实现时,可以根据具体情况进行调整。

Technologyforgood | 园豆:5675 (大侠五级) | 2024-01-29 20:27
0

做个自增长的id预留位置拼进去?

nhme | 园豆:206 (菜鸟二级) | 2024-02-01 16:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册