HTML5技术

net.sz.framework 框架 ORM 消消乐超过亿条数据排行榜分析 天王盖地虎 - 失足程序员

字号+ 作者:H5之家 来源:H5之家 2017-07-26 15:00 我要评论( )

序言 天王盖地虎, 老婆马上生孩子了,在家待产,老婆喜欢玩消消乐类似的休闲游戏,闲置状态,无聊的分析一下消消乐游戏的一些技术问题; 由于我主要是服务器研发,客户端属于半吊子,所以就分析一下消消乐排行榜问题; 第一章 消消乐排行榜大致分为好友排行

序言

 

天王盖地虎,

 

老婆马上生孩子了,在家待产,老婆喜欢玩消消乐类似的休闲游戏,闲置状态,无聊的分析一下消消乐游戏的一些技术问题;

由于我主要是服务器研发,客户端属于半吊子,所以就分析一下消消乐排行榜问题;

第一章

消消乐排行榜大致分为好友排行榜和全国排行榜;

好友排行榜和全国排行榜的其实是重合的只是需要从全国排行榜中提取出来而已;

那么就需要记录所有玩家的通关记录已进行查询;

也许你说全国排行榜只显示前xxx名就好;但是你的好友记录必须要的吧?你的好友不可能全部进入全国排行榜吧;

而好友排行榜基本都是要去全部显示出来排名;

所有那么问题来了:

我们加入400万用户,那么每一关卡都会有400万记录;

目前消消乐关卡开始1200关,那么就是400万 x 1200 = 48亿条数据;这他妈的吓死人啊;

消消乐游戏,最大的技术关键是排行榜查询问题,反而写入速度,和频率却不高;

还有重要的一点是每一关卡的玩家流失率大约:0.xx%;

由于我在家休息中,家里开发环境限制所以设定数据存在是sqlite、mysql数据库,其他数据库有待研究;如果redis 牵涉排序问题,搜索问题,么有想到好的方案;

 

第二章

我首先设计通关记录存储表结构模型;

需要,玩家id,通关关卡,通关星级,通关积分,通关时间

1 class TopList extends DataBaseModel implements Serializable, Cloneable { pid; point; star; time; integral; getPid() { 15 return pid; 16 } setPid(long pid) { 19 this.pid = pid; 20 } getPoint() { 23 return point; 24 } setPoint(int point) { 27 this.point = point; 28 } getStar() { 31 return star; 32 } setStar(int star) { 35 this.star = star; 36 } getTime() { 39 return time; 40 } setTime(long time) { 43 this.time = time; 44 } getIntegral() { 47 return integral; 48 } setIntegral(int integral) { 51 this.integral = integral; 52 } 53 54 @Override 55 public Object clone() { 56 try { .clone(); } catch (CloneNotSupportedException ex) { 59 } ; 61 } 62 63 }

View Code

测试代码

main(String[] args) throws Exception { 2 3 SqliteDaoImpl sdi = new SqliteDaoImpl("/home/toplist.db"); 4 TopList topList = new TopList(); 5 6 CUDThread cudt = new CUDThread(sdi, "top-list-thread"); cudt.setMaxTaskCount(500000); cudt.setGetTaskMax(5000); sdi.createTable(topList); LongId0 longId0 = new LongId0(); (int i = 0; i < 50000; i++) { 19 long id = longId0.getId(); (int j = 1; j <= 500; j++) { 22 23 TopList clone = (TopList) topList.clone(); 24 clone.setPid(id); 25 clone.setTime(System.currentTimeMillis()); 26 clone.setPoint(j); 27 clone.setStar(3); clone.setIntegral(RandomUtils.random(20000, 400000)); 30 31 cudt.insert_Sync(clone); 32 } 33 } 34 35 }

 

sqlite插入速度非常快,

[07-25 11:28:20:368:DEBUG:CUDThread.run():219] 新增数据插入影响行数:5000 耗时:115 [07-25 11:28:20:368:DEBUG:CUDThread.run():246] 当前待处理剩余数量:7257 [07-25 11:28:20:524:DEBUG:CUDThread.run():219] 新增数据插入影响行数:5000 耗时:155 [07-25 11:28:20:524:DEBUG:CUDThread.run():246] 当前待处理剩余数量:8342 [07-25 11:28:20:696:DEBUG:CUDThread.run():219] 新增数据插入影响行数:5000 耗时:172 [07-25 11:28:20:696:DEBUG:CUDThread.run():246] 当前待处理剩余数量:9129 [07-25 11:28:20:818:DEBUG:CUDThread.run():219] 新增数据插入影响行数:5000 耗时:122 [07-25 11:28:20:818:DEBUG:CUDThread.run():246] 当前待处理剩余数量:8188 [07-25 11:28:20:973:DEBUG:CUDThread.run():219] 新增数据插入影响行数:5000 耗时:154 [07-25 11:28:20:973:DEBUG:CUDThread.run():246] 当前待处理剩余数量:8424

 

我们查询一下数据库;

 

总数据是560多万行数据;

查询一下关卡数据

 

查询关卡数据很快;

但是我需要排序

 这些就看出对比了吧,这仅仅只有不到600万条数据呢;而且我们仅仅是查询了全国总排行,还么有牵涉好友排行榜,多条件搜索;

 

第三章

数据库可以增加索引的,加入索引后,查询会快很多;

那么接下来我们修改模型,测试

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 前端通用框架可行性研究报告之弹窗 - 你猜猜看

    前端通用框架可行性研究报告之弹窗 - 你猜猜看

    2017-07-15 11:01

  • easyui框架--基础篇(一)--数据表格datagrid(php与mysql交互) - 渡劫的机器猫

    easyui框架--基础篇(一)--数据表格datagrid(php与mysql交互) -

    2017-07-02 17:03

  • 轻量级高性能ORM框架:Dapper高级玩法 - 云中客

    轻量级高性能ORM框架:Dapper高级玩法 - 云中客

    2017-07-02 13:02

  • 【原】无脑操作:eclipse + maven搭建SSM框架 - {name:代码屠夫}

    【原】无脑操作:eclipse + maven搭建SSM框架 - {name:代码屠夫}

    2017-06-30 17:04

网友点评