设为首页 加入收藏

TOP

redis实战之使用redis实现排行榜
2015-11-21 01:30:29 来源: 作者: 【 】 浏览:1
Tags:redis 实战 使用 实现 排行榜

设想在一个游戏中,有上百万的玩家数据,如果现在需要你根据玩家的经验值整理一个前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方法获取排行榜

实现代码:

functions.php

?


  zadd($key, $socre, $userInfo));

}

function getRank($key, $withscores=true){
	require_once 'iredis.php';  
	$redis = new iredis();
	return $redis->ZREVRANGE($key, 0, -1, $withscores);
}
iredis.php

?

?


  connect('127.0.0.1', '6379');
	}
}
index.php

?

?


   'http://www.×××.com/××.jpg',
			'username' => 'ben',
			'userId' => 23
		)
	)
);

//设置dongxie的score
setRank('rank', 250, 
	json_encode(
		array(
			'img' => 'http://www.×××.com/××.jpg',
			'username' => 'dongxie',
			'userId' => 33
		)
	)
);

//设置xidu的score
setRank('rank', 50, 
	json_encode(
		array(
			'img' => 'http://www.×××.com/××.jpg',
			'username' => 'xidu',
			'userId' => 45
		)
	)
);

//更新xidu的score
setRank('rank', 6000, 
	json_encode(
		array(
			'img' => 'http://www.×××.com/××.jpg',
			'username' => 'xidu',
			'userId' => 45
		)
	)
);

var_dump(getRank('rank'));

执行结果:

?

\

原文:http://blog.csdn.net/u011250882/article/details/48632379
?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇ZooKeeper典型的应用场景 下一篇OCPV13.02-663

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: