• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

如何设计一个实时排名系统

php 搞代码 3年前 (2022-01-25) 10次浏览 已收录 0个评论
文章目录[隐藏]

现在要做一款游戏产品,涉及到计分排行问题,
简单的排行用redis的sort set就能完成的,
可是动态的排行该如何设计呢?
比如按月排行,其实就是当前时间到过去30天内的排行,
因为时间是时刻在变的,所以时间维度是每秒都是变得。
应蓝浩的询问,补充下
是一个游戏,一般10-40秒玩一局,
玩完了,会有评分的,
现在需要月排名(此刻到30*24*3600秒以前的排名),
如果一个人玩多次的,按最好的成绩统计。

回复内容:

现在要做一款游戏产品,涉及到计分排行问题,
简单的排行用redis的sort set就能完成的,
可是动态的排行该如何设计呢?
比如按月排行,其实就是当前时间到过去30天内的排行,
因为时间是时刻在变的,所以时间维度是每秒都是变得。
应蓝浩的询问,补充下
是一个游戏,一般10-40秒玩一局,
玩完了,会有评分的,
现在需要月排名(此刻到30*24*3600秒以前的排名),
如果一个人玩多次的,按最好的成绩统计。

我也来帮忙吧。

也是用的ZSET,比如用户胜利加分:

<code>ZINCRBY DAY:20150113 60 KavlezZINCRBY DAY:20150113 80 舞千寻</code>

就像这样,那就是一天一个ZSET。
但如果最多也就统计30天的话,那就永远是30个,每天加一个DEL一个。

每天(或者几分钟)更新一次最近30日ZSET:

<code>ZUNIONSTORE LAST30 2 LAST30 DAY:20150113<a>2本文来源gao*daima.com搞@代#码&网6</a><pre>搞gaodaima代码

前10:

<code>ZREVRANGE LAST30 0 10 WITHSCORES</code>

可以试试socket.io,这个就是维持一个长连接,有了长连接一切就好办啦〜

mongodb适合干这个

每次评分都算一条记录(文档),加上时间戳,存起来
出评分榜时aggregate搞定

既然是实时榜,那你就实时更新ZSETSCORE就可以了。

至于你说最近30天的排行榜,我想你说的是最近30天积分增长的排行榜吧,如果总积分榜就没有最近30天的说法了。

产品逻辑参考segmentfault的“榜单”,实现方法就是用ZSET记录每天的用户积分增长,这样周榜、月榜、季榜、年榜都可以用ZUNIONSTORE得出。

做过几个游戏的排行榜,说下自己的思路。

排行榜按照时间划分为:

  1. 历史排行。所谓历史排行,说明成绩数据已经固化下来了,数据已经不可能再发生变化了。例如月排行,周排行。
  2. 即时排行。数据最新的排行,数据还在发生着变化。

玩家查看排行榜一般来说有两个关注点:

  1. 前N名的数据,例如前100名的数据。
  2. 自己的名次以及自己名次前后N名的玩家。

基于上面两点一般会把排行榜数据分成两份:

  1. 前N数据单独放在一张表里面,这张表的数据较少,更新频繁,数据非常的即时。
  2. 把成绩换算成阶段,比如10积分一个阶段。记录每个阶段的人数,以及每个阶段的前N个人。

不知道我讲清楚没。

可以尝试一下 Meteor 框架,是一个基于 nodejsmongodbWebApp 框架,通过 DDP 协议来处理实时通信。实时代码更新,在服务器代码更新后,客户端无须用户干预。而且有延迟同步机制,用户提交的数据实时反馈在屏幕上,如果因为网络原因数据提交失败,数据会在网络重新连接后上传。
Meteor官网

採樣密度呢?要先說清楚你的排行依據


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:如何设计一个实时排名系统

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址