https://blog.youkuaiyun.com/u011250882/article/details/48632379/
2015年09月21日 21:51:19 dongxie548 阅读数:12345 标签: redis排行榜 更多
个人分类: redis
所属专栏: redis实战
版权声明:本文为博主原创文章,转载请注明出处和作者名,尊重别人也是尊重自己 https://blog.youkuaiyun.com/u011250882/article/details/48632379
设想在一个游戏中,有上百万的玩家数据,如果现在需要你根据玩家的经验值整理一个前20名的排行榜,你会怎么做呢?
一般的做法是写一条类似下面这条sql语句的方式来获取:
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方法获取排行榜
实现代码:
<?php
include('./redis.php');
//设置ben的score
$redis->zadd('rank', 260,
json_encode(
array(
'img' => 'http://www.×××.com/××.jpg',
'username' => 'ben',
'userId' => 23
)
)
);
//设置dongxie的score
$redis->zadd('rank', 250,
json_encode(
array(
'img' => 'http://www.×××.com/××.jpg',
'username' => 'dongxie',
'userId' => 33
)
)
);
//设置xidu的score
$redis->zadd('rank', 50,
json_encode(
array(
'img' => 'http://www.×××.com/××.jpg',
'username' => 'xidu',
'userId' => 45
)
)
);
//更新xidu的score
$redis->zadd('rank', 6000,
json_encode(
array(
'img' => 'http://www.×××.com/××.jpg',
'username' => 'xidu',
'userId' => 45
)
)
);
echo '<pre>';
var_dump($redis->zRange('rank', 0, -1));