移动互联网实战--社交游戏的排行榜设计和实现(1)

前言:
  游戏领域, 特别是移动端的社交类游戏, 排行榜成为了一种增强体验交互, 提高用户粘性的大法宝. 这边讲述在不同用户规模下, 游戏服务化/游戏平台化趋势下, 如何去设计和实现游戏排名榜. 本文侧重于传统关系型Mysql的方案实现, 后续会讲解Nosql的作用. 小编(mumuxinfei)对这块认识较浅, 所述观点不代表主流(工业界)做法, 望能抛砖引玉.

需求分析
  曾几何时, 微信版飞机大战红极一时. 各路英雄刷排名, 晒成绩. 不过该排名限制在自己的好友圈中, 而每个用户的好友圈各不一样, 因此每个用户有自己的排名. 且排名按周重置清零. 一些简单的移动端游戏(比如2048, 没有好友概念), 则采用简单的全局排名的方式, 且排名采用历史最高.

  
  综上的列子, 对于游戏排行榜, 我们可以依据属性来进行划分.
  1). 按是否属于好友圈划分
  * 游戏全局的Top N模式.
  * 以自身好友圈为界的Top N模式.
  2). 按时间周期来划分
  * 按时间周期重置, 比如按周清零
  * 历史最高, 没有重置清零机制

基础篇: 
  社交类游戏, 在小规模用户的前提下, 借助关系型数据库(mysql)来实现, 采用单库单表.
  定义好友表tb_friend

CREATE TABLE IF NOT EXISTS tb_friend (
  id INT PRIMARY KEY AUTO_INCREMENT,
  user_id varchar(64),
  friend_id varchar(64),
  UNIQUE KEY `idx_tb_friend_user_id_friend_id` (`user_id`, `friend_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  用户得分表tb_score

CREATE TABLE IF NOT EXISTS tb_score (
  id INT PRIMARY KEY AUTO_INCREMENT,
  user_id varchar(64),
  score int,
  UNIQUE KEY `idx_tb_score_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  评注: tb_friend表中user_id/friend_id构成复合索引, 用于维护user_id的好友列表, tb_score用于记录每个用户的得分情况
  在该两张表的前提之下, 如何获取该好友的排行榜呢?
  利用两表join来实现:

SELECT tf.friend_id AS friend_id, ts.score AS score
FROM tb_friend tf JOIN tb_score ts ON tf.friend_id = ts.user_id
WHERE tf.user_id = ?
ORDER BY ts.score DESC	

  类似的结果如下:
  
  评注: 在sql的join中, 需要注意left join/equal join/right join的区别. 这边选用等值join.

性能评估和执行分析:
  1). 小表+大表模式: 在tb_friend单表9801条(100个小伙伴, 互为好友)/tb_score单表53条(53个小伙伴有得分)记录下, 进行join分析
  执行规划

EXPLAIN
SELECT tf.friend_id AS friend_id, ts.score AS score
FROM tb_friend tf JOIN tb_score ts ON tf.friend_id = ts.user_id
WHERE tf.user_id = ?
ORDER BY ts.score DESC

  

  评注: 这边sql优化器非常的智能, 借助了小表驱动大表的join优化方式(小表tb_score驱动大表tb_friend进行join), 小表用到了file sort(总共53行记录), 大表用了index(等值join对应一行大表记录).
  2). 等表模式: 在tb_friend单表19602条/tb_score单表5092条记录下, 进行join分析

  

  评注: 这边tb_friend表驱动tb_score作join, tb_friend借助复合索引(user_id,friend_id)来加速优化. Mysql的sql优化器还是相当的智能和强大.

进阶篇:
  随着数据规模越来越大, 并发访问量的增加, mysql的访问逐渐变成瓶颈. 同时该join的sql语句涉及的filesort非常耗CPU的. 如何破解这种状况?
  *) 引入分布式mysql集群, 进行分库分表.
  分库分表作为互联网的一大神器, 作用立竿见影. 但是有所得,就会有所失, 分库分表后, 会失去很多特性. 比如事务性, 外键约束关联. 在业务这层, 会导致涉及用户的tb_score, tb_friend表数据不在同一库中, 进而导致join失效. 最终导致, 在应用层做merge, 使得排名操作演变成 1+N sql操作(1 sql 用于获取好友列表, N sql 用于获取每个好友的得分). 这需要注意.

  1+N的SQL演化, 应用层做得分排序, 性能会演变成一场灾难.

(1) 获取用户好友列表
SELECT friend_id FROM tb_friend_{N} WHERE user_id = ?
(2) 遍历获取每个好友的得分
foreach friend_id in friend_list(?)
SELECT score FROM tb_score_{M} WEHRE user_id = ?
(3) 应用层做得分排序

  评注: {N},{M}是指具体的分表数, 当然在同一库同一表, 可以借助SELECT * IN (...)来优化,这个得看具体的数据分布. 不过是种很好的思路.
  小编观点: 由于tb_friend是大表, 而tb_score是小表, 因此tb_friend采用分库分表(以user_id作为依据)的方式去实现, 而tb_score采用单库单表(便于批量查询)的方式实现. 
  当然在工业界, Mysql的优化方案非常的成熟, 不光是分库分表,还有主从分离(Master/Slave机制, Master用于写服务, 多Slave节点提供读服务).
  可以参见如下的图示:
  

总结&后续:
  这边主要讲述基于传统关系型数据库mysql来实现基于好友的游戏排行榜, 个人的战绩需要实时的去获取, 而好友列表的战绩能允许有一定的延迟. 而好友战绩的排序实现,就成为了本文的中心议题. Mysql的实现方案在数据量/并发数增加的前提下,还是显示了一定的疲态. 下文将讲解, 如何引入Nosql系统, 在游戏rank中,扮演重要的角色. 期待你的关注.

移动互联网实战--社交游戏的排行榜设计和实现(1),布布扣,bubuko.com

时间: 2024-12-20 07:06:37

移动互联网实战--社交游戏的排行榜设计和实现(1)的相关文章

移动互联网实战--社交游戏的排行榜设计和实现(2)

前言: 游戏领域, 特别是移动端的社交类游戏, 排行榜成为了一种增强体验交互, 提高用户粘性的大法宝. 这边讲述在不同用户规模下, 游戏服务化/游戏平台化趋势下, 如何去设计和实现游戏排名榜. 本文侧重讲解Nosql在游戏排名榜中的作用. 小编(mumuxinfei)对这块认识较浅, 所述观点不代表主流(工业界)做法, 望能抛砖引玉. 秉承: 上一篇文章, 详见: 社交游戏的排行榜设计和实现(1) 进阶篇: 随着数据量/并发量的上涨, Mysql集群也呈现了一些疲态. (1). 数据库分库分表后

游戏UI框架设计(五): 配置管理与应用

游戏UI框架设计(五) --配置管理与应用 在开发企业级游戏/VR/AR产品时候,我们总是希望可以总结出一些通用的技术体系,框架结构等,为简化我们的开发起到"四两拨千金"的作用.所谓"配置管理"是指一个游戏项目(软件项目),很多需要经常变化的需求或者数据,最好以配置文件的形式存在,从而代替"硬编码"方式.      这里笔者就对游戏产品中大量应用到动态加载的情形,开发出一套通用的配置管理(脚本)工具.该工具可以很方便的对于具备"键值对&

游戏开发与设计

最近大家对游戏设计和开发热情度很高,经常有小伙伴跟小编在后台聊游戏开发的书,这不,赶紧整理一下,嘿,游戏开发的书还真是不少,12本. 通读类 作者:加藤洁 译者:徐谦 书号:978-7-115-37581-0 定价:59.00 元 页数:264 揭示游戏逼真.流畅的秘密 42个编程实例,打通游戏开发的任督二脉 134张图解,清晰讲解游戏编程五大基本实现 <游戏开发的数学和物理>严格选取了游戏开发中最常用的数学和物理学知识,通过游戏开发实例,配上丰富的插图,以从易到难的顺序进行讲解.第1章到第5

移动互联网实战--资源类APP的数据存储处理和优化

前言: 对于资源类的APP, 其音频/图形占据了APP本身很大的比例. 如何存储和管理这些资源文件, 成了一个颇具挑战性的难点. 移动端的碎片化, 高中低端手机的并存, 需要开发者不光是具备基础的存储知识, 更需要基本优化的能力. 本文首先介绍手机硬件的基础, 后续会分别介绍存储方式, 资源打包, 最后以一个具体例子作结. 内容还是浅显, 望能抛砖引玉. *) 硬件基础 作为手机开发者人员, 你是否知道RAM/ROM/存储卡的区别? 而产商所宣传的运行内存, 机身内存又是什么? 1). RAM/

游戏UI框架设计(五): 配置管理与应用

游戏UI框架设计(五) --配置管理与应用 在开发企业级游戏/VR/AR产品时候,我们总是希望可以总结出一些通用的技术体系,框架结构等,为简化我们的开发起到"四两拨千金"的作用.所谓"配置管理"是指一个游戏项目(软件项目),很多需要经常变化的需求或者数据,最好以配置文件的形式存在,从而代替"硬编码"方式. 这里笔者就对游戏产品中大量应用到动态加载的情形,开发出一套通用的配置管理(脚本)工具.该工具可以很方便的对于具备"键值对"

献给chinajoy:社交游戏死期将至?

一个公认的事实是,社交游戏的生命周期平均只有6个月左右,快速的崛起和快速的没落,几乎成为了无论移动还是网页形态的社交游戏们一贯宿命.而社交游戏依然是中国游戏行业的宠儿,只是方向从网页转向了移动端. 文_张书乐 刊载于<创意世界>2014年8月刊 4月初,日本知名游戏厂商万代南梦宫(NBGI)副社长鹈之泽对外表示,PS4和Xbox One将逐渐改变日本游戏市场中社交游戏泛滥的状况.显然,鹈之泽并不是第一个预言社交游戏未来的"毒舌".在去年12月底以色列的一次活动上,现代MMO

这个必须有,用真实社交游戏遏制“蓝鲸”

要遏制"蓝鲸"这类死亡游戏带来的强迫症式体验,建议采取"以毒攻毒"的"替代疗法".比如让玩家在社交基础上获得更有成就感的游戏体验,真正达到治本的效果. 文/张书乐 人民网.人民邮电报专栏作者,著有<微博运营完全自学手册> 曾有人总结过玩家患上游戏强迫症的状态:套装.成就全收集:地图.场景全探索:射击游戏打了两枪就换子弹:地图上的箱子必须全部开启:将NPC全部对话一遍:一分钟一存档:精心创造一个独特角色:场景内物品全破坏:见到新游戏就下

《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)

注意:本系列教程为长篇连载无底洞,半路杀进来的朋友,如果看不懂的话,请从第一章开始看起,文章目录请点击下面链接. http://blog.csdn.net/lufy_legend/article/details/8888787 一,内容预览 算起来,游戏脚本系列文章已经很久没更新了,虽然该系列文章更新缓慢,但是确实还是能够帮到一些朋友,前段时间,仅仅因为做毕业设计通过邮件联系我的就有4位学生.有鉴于此,我还是挤点儿时间来继续慢慢更新一下了.另外,我想再声明一下,目前该脚本引擎还处在移植开发阶段,

移动互联网:社交的发展,人脉的扩展

随着移动互联网的发展,已经受到了越来越多的企业的高度重视.从移动互联网覆盖面的不断扩大.网速的提高及智能终端的不断配合发展,都创造了极大的发展空间. 在移动互联网开头,以SNS.微博及LBS等各式各样为代表的社交网络应用,为整个人类的交流沟通带来了深刻的变化,人们的交往更加便利,信息的传播更加迅速,这一切也为企业营销创造了极为有利的条件. 针对智能手机用户的研究发现,74%的人使用他们的智能手机访问社交网络,42%的人每天都会使用社交网络.根据无线互联网数据和移动数据采集合作伙伴,社交网络是首要