前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实时排行榜的几种实现方案

实时排行榜的几种实现方案

作者头像
ImportSource
发布2019-07-04 13:05:51
7.9K0
发布2019-07-04 13:05:51
举报
文章被收录于专栏:ImportSourceImportSource

实时排行榜要求实时,不能有延迟。要实现此,就必须是插入时排序,而不能读取时排序。读取时排序的工作量非常之大。这里列几种可能的方案。

桶排序

在游戏开发中,大部分时候需要对分数做排行榜。比如,分数区间在1-5000,但用户可能有几百万个。显然在这种场景下很多人都是相同的分数。此时就可以把1-5000设计成5000个桶,然后把每个用户按照自己的分数分别放入对应的分数桶。

要查询实时排行榜topN只需要把分数高的前面几个桶合起来展示就可以了。

桶排序

redis实现

使用redis的sorted set来排序。sorted set是一个有序列表。你可以使用zadd、zrange以及zrank轻松实现实时的排名。

添加三个人的分数

获取所有人(包含分数)

倒序获取所有人(包含分数)

获取张三的排名(正序)

获取张三的排名(倒序)

redis的sorted set是用skip list(跳表)算法实现的。时间复杂度为O(log(N))。skip list是一个基于链表然后额外创建父链表,从而使得链表的查找效率得到提高。另外由于skip list插入一个元素,只需要修改前驱和后继的引用即可轻松插入一个元素,所以性能也要比平衡树还要好(平衡树要各种旋转)。

平衡树

java的treemap是基于红黑树来实现。可以尝试通过treemap来实现排行榜。

通过这种方式来实现需要解决几个问题:

1、分数相同时怎么解决?我目前想到的是通过分段来决定唯一。设置小数点后几位为用户ID。

2、如何实时获取到指定用户的分数以及排名?

抛砖引玉一下,欢迎说出你的方案!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ImportSource 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档