• 1
  • 2
  • 3
  • 4
  • 5
mysql数据库问题 首 页  »  帮助中心  »  数据库  »  mysql数据库问题
在休闲游戏中使用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.插入一条数据

 

 图3

  如图2所示,我就简单地判断了下他现在的分数是不是比以前的高,如果比以前的高就插入一条数据。非常简单。

  2.得到前10的玩家分数

 图4

  如图3所示,看起来非常简单,最后我用了json_encode把php中的数组转换成json了。这样的话方便处理。

  3.得到我的排名

  

                图5

  图4所示的,稍微复杂了一点点,我先得到这个玩家的排名,这样就可以得到他前后4名玩家的排名区间了,用下zrevrange就ok了。就是要注意left是负数的话是其他的意思,所以要避免是负数。最后我对php数组中加入了排名信息,再次以json返回。

  四、cocos2d js中的http

  php已经可以返回json的数据了,下面讲下cocos2d js中如何使用http 来显示top 10的玩家信息。如图5所示,直接给出代码,也比较简单。主要要注意的是要对返回的数据进行JSON.parse处理。插入数据用post,得到排行榜信息用get就OK了。我也没加反作弊功能

 

                                          图6

  最后大家玩下这个使用了上面讲到的技术的html5游戏,用cocos2d js开发的。http://www.cgame360.com/halloweengame/