在休闲游戏中使用redis作为排行榜的数据存储
发布日期:2016-4-12 18:4:14
在休闲游戏中使用redis作为排行榜的数据存储 一、排行榜的需求 图1 我做了一个网站 http://www.cgame360.com/,专门放一些简单的html5游戏。现在有2个需求,我想获得一个游戏的top 10的用户的分数,还有一个是某个用户的排名,再加上前后4名的人员。如图1所示,上图中少了名字,那个cocos2d js输入框有点问题就没加了。 现在的问题就是用什么数据库来存储比较好?我想要尽可能快的查找出数据。 我搞过mysql这种关系型的数据库,第一感觉是用在这里会很慢。mysql中数据量一大就会变得很慢,因为它排序的时候会对所有数据进行处理。还有第二个需求用sql语句会很费力,我还没想到高效的实现方式。第一个前10名的,可以搞一个表来专门存前10名的。现在主要就是卡在第二个需求。 我谷歌了下,发现nosql比较适合现在的需求。nosql比较有名的是Hadoop,MongoDB。但我发现一个更加适合这个需求的数据库:redis. 二、redis中的有序集合 1.redis有序集合插入一条数据 这里再从安装redis讲起很浪费时间。我记得好像Mac的系统比较容易用,windows里redis不太好用。 redis的有序集合中插入一条数据非常容易: ZADD key score memeber 具体示例: ZADD game1 89 tom 这样game1中就有一条数据:Tom的分数是89 2. redis得到排名在某个范围的元素列表 ZRANGE key start stop [withscores] ZREVRANGE key start stop [withscores] 具体例子: ZRANGE game1 0 -1 withscores 这样就可以得到game1中的所有记录,按从小到大排序,-1表示最后一个元素的意思。 那么我们想要得到前10的记录要用什么命令呢? 这非常简单:ZRANGE game1 -10 -1 withscores -10 表示往数10个的意思。如图1所示,是我的mac机执行的输出: 图2 zrevrange 表示逆向的意思,会从大到小输出。 3. redis得到一个元素的排名 ZRANK key member ZREVRANK key memeber 具体示例: zrank game1 tom 4. redis 得到一个元素的分数 ZSCORE key member 具体示例: zscore game1 tom 三、PHP 中使用redis 上面讲的redis命令已经足够我们使用,接下来就是用redis和java或php等服务器语言来组成一个服务了。我这里选择了PHP的原因是我感觉用户提交一个分数用http的post,得到排行榜的分数用php的get够用了。 php中使用redis有两种方式,分别是predis 与phpredis,前者为完全使用php的,后者是c语言编写的php扩展。后者的性能会好些,但需要安装php扩展比较麻烦。predis非常简单,就是一些php文件,扔到网站目录下就能工作了。所以在这里选择使用了predis. 1.插入一条数据 如图2所示,我就简单地判断了下他现在的分数是不是比以前的高,如果比以前的高就插入一条数据。非常简单。 2.得到前10的玩家分数 图4 如图3所示,看起来非常简单,最后我用了json_encode把php中的数组转换成json了。这样的话方便处理。 3.得到我的排名 图4所示的,稍微复杂了一点点,我先得到这个玩家的排名,这样就可以得到他前后4名玩家的排名区间了,用下zrevrange就ok了。就是要注意left是负数的话是其他的意思,所以要避免是负数。最后我对php数组中加入了排名信息,再次以json返回。 四、cocos2d js中的http php已经可以返回json的数据了,下面讲下cocos2d js中如何使用http 来显示top 10的玩家信息。如图5所示,直接给出代码,也比较简单。主要要注意的是要对返回的数据进行JSON.parse处理。插入数据用post,得到排行榜信息用get就OK了。我也没加反作弊功能 最后大家玩下这个使用了上面讲到的技术的html5游戏,用cocos2d js开发的。http://www.cgame360.com/halloweengame/ 上一条: 10个教程让你轻松备份MySQL数据库 下一条: PostgreSQL(数据库)的一些资料
|