r*********n 发帖数: 32 | 1 设计一个在线游戏的排名系统。游戏是回合制的,每一回合结束后都会获得一个分数。
玩家可以在游戏中添加好友,每个玩家有任意个好友。在每一回合结束后,游戏界面需
要弹出两个排序的表格:(1)玩家及其所有好友的最高分数排序top 10;(2)玩家的
分数在所有用户(million级别)最高分数中的排名,以及该排名的前十位、后十位的
玩家及分数
主要是数据如何存?如何及时更新,大量玩家怎么获得million 级别的前10,后10 |
m******e 发帖数: 82 | 2 数据库(或nosql)+Redis Zset可以 |
s**********g 发帖数: 14942 | 3 肯定要shard吧
最终的前10和后10不会跳出每个server的前10后10的总集。。 |
d***o 发帖数: 113 | 4 可以考虑push model
每个玩家有自己的feed
游戏结束后就向所有这些feed都发送分数,看是否能进入前十
这样的结果是读取起来是很快的
trade off就是发送过程比较慢,但由于实时性要求不是很高,用另一个asynchronous
service做就行 |
j**********r 发帖数: 3798 | 5 用户数据随便一个NoSQL存即可,朋友排序实时比。总体排名可以按分数多服务器分段
排序. 一个服务器管一个数据段。 |
w****r 发帖数: 15252 | 6 普通游戏的用户数量,就算是Pokemon Go, Redis足够了,不需要shard吧
asynchronous
【在 d***o 的大作中提到】 : 可以考虑push model : 每个玩家有自己的feed : 游戏结束后就向所有这些feed都发送分数,看是否能进入前十 : 这样的结果是读取起来是很快的 : trade off就是发送过程比较慢,但由于实时性要求不是很高,用另一个asynchronous : service做就行
|
c***w 发帖数: 134 | 7 我见过的工业届的做法是这样的
用redis cluster管理cluster,其中有hashslot 16384个,hashslot和shard一样,之
后用redis 中的排序集合存数据,存不同的纬度,比如一个区域,城市,州,国家的排
名(leaderboards),或者好友排名等。用redis有一个问题就是,容易丢数据,redis一
般用AOF (persist writes)或者 RDB (snapshot) ,问题是不容易存每一个write。因
为snapshot是没分钟级别的,AOF可以调整成记录所有的writes,但是performance会特
别的差,官方doc不建议用。这时候,需要有个write ahead log之类的东西去记录,所
以不管你自己实现,或者用一些别的工具都可以。比如可以在redis前面放一个kafka。
另一个方向是不用redis,而是用一个牛逼的VoltDB数据库。效果有待检验。
这是我查的资料:
https://stackoverflow.com/questions/27706573/huge-leaderboard-ranking-with-
filtering
https://www.voltdb.com/industries-served/gaming/ |
s****a 发帖数: 794 | 8 直接甩名词会挂的
即便不知道用什么存储 用什么架构 但能分析清楚需求 并能分析各种方法的优缺点 把
设计说清楚 远比甩几个名词要好 |
w********m 发帖数: 1137 | 9 需要两个hashmap。
1M的用户单机可以,
10M的用户要shard了。 |
c***w 发帖数: 134 | 10 可以参照redis加上kafka的实现。自己设计下就好了呀。 |
d**x 发帖数: 243 | |