关于排行榜的实现思路

需求

  • 需要知道当前用户的排名
  • 需要知道前100名的用户

说明

  • 一般排行榜都不会做全局排名查询,因为要统计全部数据实在是太消耗性能了,一般都会做前100名,前N名

假设数据

ranks {
	{user:'张一', score:'100'},
	{user:'张二', score:'90'},
	{user:'张三', score:'80'},
	{user:'张四', score:'70'},
	{user:'张五', score:'60'},
	{user:'张六', score:'500'},
	{user:'张七', score:'50'},
	{user:'张八', score:'50'},
}

1. 同级别排行榜,获取排名

  • 这种做法在查询当前用户排名的时候非常有优势
  • 只需要做 (某某)大于(70分)有(多少人)=(3名)+(1)=(第四名)
  • 缺点:同一分数的排名是一样的

2. 超出排名,叫做未上榜

  • 首先统计出前100名排行榜并且缓存起来
  • 当获取用户排名的时候,验证用户ID是否存在排行榜中
  • 如果用户ID不存在,则返回 此用户未上榜,因为太Low

3. 序号+排名,获取排名(不要求真实)

  • 假设排行榜需要统计超过100名的用户的排名
  • 首先判断用户是否存在 前100 如果存在则返回当前用户所处的排名
  • 如果不存在 返回(用户当前注册进入序号 )+(排行榜100)+(1)=(当前排名)
  • 缺点:这种做法,超出排行榜名次的用户,获取的排名都是不真实的,当然如果有虚拟销量记得加上

4. 获取完全真实的排行榜

  • 这种做法能获取用户最真实的排名
  • 需要专门建立一个排行榜表单,并且通过定时对排行榜的表单进行排序,保存到表中的 rank(当前排名)字段中
  • 该做法能够实时获得排名最真实的排名,以及无限下拉排行榜
  • 缺点:假设用户有超过100W条数据,你需要将数据查找出来再保存到排行榜中去,特别消耗性能

5. 实时性高的排行榜

  • 这种做法一般是当天排行榜
  • 一般采用Redis 有序集合用来实现,看计算机能承载的性能来设计排行榜的长度范围
  • 具体参考:https://www.cnblogs.com/zhaoyan001/p/10782260.html
  • 当然这样还是不够
  • 每天12点后,还需要对当天的数据,进行持久化存储到数据库中去
  • 并且对新的数据进行重新排序(更新)

6. 获取前100名排行榜

  • 一般这种段排行榜,只需要通过SQL查询出来
  • 然后 加上 虚拟排行榜
  • 然后 合并数组 进行排序
  • 最终 得出排行榜数据 进行缓存(周期:分钟)
  • 这种消耗可能是最小的

7. 突然的想法,可以实现实时性的排名

  • 假设排行榜的字段已经 排序好 1 - 8 名
  • 用户A更新排名的时候:假如用户的分数是(100分)
  • 第一步:(查询) 大于(100分)的(倒序排序用户B:一条记录)是(第几名)
  • 第二步:(更新)小于(100分)的(所有用户)(Rank排名)加上(1)
  • 第三步:(得到)当前(用户A)的(排名)等于(用户B)的(Rank排名)加上(1)
  • 第三步:(更新)当前(用户A)的(分数)和(Rank排名)

基于这些需求

  • 可以开发一个专门做排行榜的服务,并以此来开展公司
  • 排行榜区分几种特性:实时性、真实性
  • 排行榜区分几种类型:总榜(不保证实时性,但真实)、日榜(Redis实现,可以保证实时性,但真实)
  • 然后我还真的发现了有那么一家公司:https://leancloud.cn/pricing/
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
跳表是一种数据结构,可以高效地实现有序链表和有序集合,可以用来实现排行榜。跳表是通过在原始链表中添加多级索引节点来加速查找操作的。 跳表的实现思路如下: 1. 创建一个带有头节点的链表,头节点的值为负无穷大,尾节点的值为正无穷大。 2. 在原始链表中,插入新的节点时,根据节点的值,决定是否在当前层级上添加索引节点。添加索引节点的概率可以根据需求进行调整。 3. 使用索引节点可以将跳表分为多个层级(level),每一层级都是一个有序链表。 4. 查询操作时,从最高层级开始,从左向右逐层搜索,直到找到目标值所在的区间(比目标值大的最小节点和比目标值小的最大节点之间)。 5. 对于插入和删除操作,首先在最底层进行,然后根据概率决定是否在上层级插入或删除对应的节点。 使用跳表来实现排行榜的步骤如下: 1. 创建一个跳表,每个节点存储着用户的信息,包括用户的排名、分数等。 2. 初始化排行榜时,将所有用户按照分数从大到小顺序插入跳表中。 3. 当有新的用户加入或者用户的分数发生变化时,根据新的分数更新用户节点的位置。 4. 当需要查询某个用户的排名时,可以通过跳表中的索引节点,快速定位到该用户所在的层级,然后在该层级中按照顺序遍历找到目标节点,并返回排名。 通过以上步骤,我们可以使用跳表高效地实现排行榜功能。跳表的插入、删除和查找操作的时间复杂度都可以达到O(log n),在大数据量下具有较高的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值