golang笔记:游戏中排行榜的实现

news/2025/2/13 15:54:38/

date: 2017-08-29
title: “golang笔记:游戏中排行榜的实现”
draft: false
categories:

  • golang
  • game
    tags:
  • golang
  • game
    thumbnailImagePosition: left

原文地址https://github.com/liyiheng/blog-gen

游戏开发中排行榜经常出现,接触过的排行榜有两种。一种是由玩家挑战排名比自己靠前的其他玩家,胜利后交换位置;另一种是根据玩家的某特性对所有玩家进行排序。第一种只涉及到两个玩家数据的变化,实现起来比较简单,因此只记录第二种情况。

需求

  • 排行榜内容是有序的所有玩家信息(以等级为例)
  • 玩家等级变化后,更新排行榜
  • 根据玩家id获取在排行榜中的排名
  • 获取排行榜中特定排名的玩家

思路

思路一。如果用关系型数据库的话,实现排行版比较简单,一条SQL即可。由于游戏服务器并发量大、排行榜数据变化频繁,用SQL显然不合适。

思路二。用数组作为排行榜存放玩家信息并对其进行排序。有新玩家加入或玩家等级变化时,重新排序。这样的好处是获取特定排名的玩家时很快,时间复杂度仅仅是O(1)。但是获取某玩家的排名时需要遍历整个数组,时间复杂度是O(n)。有新玩家加入或玩家信息有变化时,需要重新排序,以归并排序为例,其平均时间复杂度为O(nlogn)。每次更新排行榜都需要排序,不断地排序似乎并不优雅。于是考虑定期排序,如每分钟排一次序。

思路三。思路二的情况下,如果某玩家的排名上升了1000名,操作数组就要把被他超越的1000个玩家数据都向后移动。于是考虑了使用链表替代数组。但是这就带来了新的问题,通过排名获取玩家时,就要遍历链表,思路二中这个操作的时间复杂度为O(1),现在就变成了O(n)。故不能使用链表,或者说不能直接使用普通的链表。

思路四。借助Redis。网上搜索一番,似乎大家都是用Redis的zset来处理排行榜,看了一些介绍觉得靠谱。然鹅,项目中没用使用Redis,为了一个小的功能加上一个Redis似乎不太必要。幸运的是,项目中用到了ssdb,这货号称兼容Redis的api。

完美解决?呵呵。写到一半时发现ssdb文档中关于zrank有这么一句话:

Important! This method may be extremly SLOW! May not be used in an online service.

大招

Redis处理zset用的是一个特殊的跳表,不妨自己实现一个一模一样的。

然而 不会 嫌麻烦。既然Redis是开源的,照搬过来就好了。

还没搬完,只是简单实现了几个基本的需求,欢迎PR


http://www.ppmy.cn/news/191589.html

相关文章

使用Redis构建高效稳定低延迟的排行榜业务

一、业务描述 现有一排行榜业务,数据库中拥有百万级用户,中秋佳节将要来临,用户可以写一篇关于中秋的故事,故事可邀请好友点赞,也可以打赏该故事,现在要挑选出关于中秋话题相关的故事,根…

PyFlink 有状态流处理实例 实时排行榜

01 UDAF 聚合函数的使用 自定义聚合函数(UDAF),将多条记录聚合成一条记录。其输入与输出是多对一的关系,即将多条输入记录聚合成一条输出值。 需要注意的是:当前聚合函数仅在流模式下的 GroupBy 聚合和 Group Window…

排行榜奖励发放

一般来说排行榜奖励都通过邮件来发放,要不就是对于在线用户直接发给用户自身,对于离线用户发到用户的离线邮箱,用户上线可以通过邮件取到。这样做简单直接,易于处理,也不容易出错,但是在用户很多的时候可能…

字节跳动系统设计面试实时排行榜

题目 现在有个游戏,有亿级别的用户会来玩,玩游戏后会获得一个分数,当游戏结束的时候返回给用户自己所在的排名和排名前百分比,如何设计这样一个系统。 思路 功能其实并不算复杂,有很多种方式可以实现,所…

mongo aggregate统计排行榜及spring mongo实现

数据分析里排行也是很常见的一项统计,下面是随便弄的测试数据的租赁次数排行统计: 脚本: db.leaseorders.aggregate([ { $match: { tenantId: "5" } }, { $project: { goodsName: 1, quantity: 1 …

大规模排行榜系统实践及挑战

声明:本文来自腾讯增值产品部官方公众号小时光茶社,为CSDN原创投稿,未经许可,禁止任何形式的转载。 作者:唐聪,2014年毕业加入腾讯,SNG增值产品部后台开发工程师,一直从事QQ会员后台…

排行榜设计

最近在做排行榜功能,排行榜无非就是对用户一些数据的排序,在量级不是很大的情况下还是比较简单的,在数据结构上使用数组,set,map都可以,依具体情况而定,这里不做过多讨论。现在遇到的问题是在数…

通过redis实现游戏排行榜功能

需求说明 水晶数量排行榜英雄熟练度排版只排前一万名,玩家只能看到前200名的数据和自己的名次每个排行榜实时刷新,玩家可以延迟5分钟查看榜单数据,但是自己的名次需要尽可能实时查看分值一样,则先达到分值的玩家前面在前 设计说…