redis实战之使用redis实现排行榜

转载:http://blog.csdn.net/u011250882/article/details/48632379

设想在一个游戏中,有上百万的玩家数据,如果现在需要你根据玩家的经验值整理一个前20名的排行榜,你会怎么做呢?

一般的做法是写一条类似下面这条sql语句的方式来获取:

[sql]  view plain  copy
  1. select * from game_socre order by score desc limit 0,20  
这种方式在数据量较小的情况下可行,但是在数据量大的情况下查询速度将变慢,特别是还需要联表查询时,速度下降的就更明显了。


这时你可以考虑使用redis来实现这个功能。

实现这个功能主要用到的redis数据类型是redis的有序集合zset。zset 是set 类型的一个扩展,比原有的类型多了一个顺序属性.此属性在每次插入数据时会自动调整顺序值,保证value值按照一定顺序连续排列。

主要的实现思路是:

1、在一个新的玩家参与到游戏中时,在redis中的zset中新增一条记录(记录内容看具体的需求)score为0

2、当玩家的经验值发生变化时,修改该玩家的score值

3、使用redis的ZREVRANGE方法获取排行榜


实现代码:

functions.PHP

[php]  view plain  copy
  1. <?php  
  2. function setRank($key$socre$userInfo){  
  3.     require_once 'iredis.php';    
  4.     $redis = new iredis();  
  5.     var_dump($redis->zadd($key$socre$userInfo));  
  6.   
  7. }  
  8.   
  9. function getRank($key$withscores=true){  
  10.     require_once 'iredis.php';    
  11.     $redis = new iredis();  
  12.     return $redis->ZREVRANGE($key, 0, -1, $withscores);  
  13. }  
iredis.php

[php]  view plain  copy
  1. <?php  
  2. class iredis extends Redis  
  3. {  
  4.     public function __construct(){  
  5.         parent::__construct();  
  6.         $this->connect('127.0.0.1''6379');  
  7.     }  
  8. }  
index.php

[php]  view plain  copy
  1. <?php  
  2. require_once "functions.php";  
  3.   
  4. //设置ben的score  
  5. setRank('rank', 100,   
  6.     json_encode(  
  7.         array(  
  8.             'img' => 'http://www.×××.com/××.jpg',  
  9.             'username' => 'ben',  
  10.             'userId' => 23  
  11.         )  
  12.     )  
  13. );  
  14.   
  15. //设置dongxie的score  
  16. setRank('rank', 250,   
  17.     json_encode(  
  18.         array(  
  19.             'img' => 'http://www.×××.com/××.jpg',  
  20.             'username' => 'dongxie',  
  21.             'userId' => 33  
  22.         )  
  23.     )  
  24. );  
  25.   
  26. //设置xidu的score  
  27. setRank('rank', 50,   
  28.     json_encode(  
  29.         array(  
  30.             'img' => 'http://www.×××.com/××.jpg',  
  31.             'username' => 'xidu',  
  32.             'userId' => 45  
  33.         )  
  34.     )  
  35. );  
  36.   
  37. //更新xidu的score  
  38. setRank('rank', 6000,   
  39.     json_encode(  
  40.         array(  
  41.             'img' => 'http://www.×××.com/××.jpg',  
  42.             'username' => 'xidu',  
  43.             'userId' => 45  
  44.         )  
  45.     )  
  46. );  
  47.   
  48. var_dump(getRank('rank'));  

执行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值