锁定老帖子 主题:网站实时积分排名
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-16
最近遇到一个问题就是根据需求需要对所有的用户根据积分,显示他的全站排名,数据量大概200万左右,积分是实时更改的,怎么能让这个排名尽量的实时呢?一直很困惑,之前用过db的count查,速度很慢,并且高峰时候db也容易堵住,大家有没有什么好的方法,推荐一下。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-02-16
冗余保存积分,有变动时实时更新。排序用order by 。。。。。
|
|
返回顶楼 | |
发表时间:2012-02-16
通过搜索引擎。
积分变更 动态更新索引文件。 |
|
返回顶楼 | |
发表时间:2012-02-16
xieboxin 写道 冗余保存积分,有变动时实时更新。排序用order by 。。。。。
不是很懂,能否说的详细点,至少直接select count() from table where score>? order by score desc 这样不行。 |
|
返回顶楼 | |
发表时间:2012-02-16
ben.lee 写道 通过搜索引擎。
积分变更 动态更新索引文件。 搜索引擎,可以拿到排序吗?能否详细讲一下 |
|
返回顶楼 | |
发表时间:2012-02-17
你这个我做过类似的一个项目,实时性排序要求高,不建议用db做,db只是恢复数据用,排序及前端获取排行列表,我推荐用redis,数据结构采用其内置的sorted list,性能非常好,redis只保存最简单的id+积分这么一个数据,关闭实体化选项,全部用内存来保存数据,搭建主从防止宕机,然后自己实现一个从db到redis的数据恢复过程即可。
数据保存的话,根据你实际并发量考虑,并发不高的话可以定时写入db,并发很高的话,中间需要再做一个缓冲队列。 |
|
返回顶楼 | |
发表时间:2012-02-17
最后修改:2012-02-17
tomleader 写道 你这个我做过类似的一个项目,实时性排序要求高,不建议用db做,db只是恢复数据用,排序及前端获取排行列表,我推荐用redis,数据结构采用其内置的sorted list,性能非常好,redis只保存最简单的id+积分这么一个数据,关闭实体化选项,全部用内存来保存数据,搭建主从防止宕机,然后自己实现一个从db到redis的数据恢复过程即可。
数据保存的话,根据你实际并发量考虑,并发不高的话可以定时写入db,并发很高的话,中间需要再做一个缓冲队列。 很好的解决方案,不过多想下需要增加至少两台redis主从物理服务器,这个需要leader知晓,如果考虑成本之后不需要实时,定时查一次加个缓存就可以了,如果依然需要实时,除了tomleader的方法,也可以考虑在MC中存储SortedMap对象,key为用户ID ,value为用户积分 没有测试过这个性能,但这个维护起来应该比redis方便些 |
|
返回顶楼 | |
发表时间:2012-02-17
考虑一下使用key-value数据库 redis,在这里使用sortset存储方式http://redis.io/commands#sorted_set
|
|
返回顶楼 | |
发表时间:2012-02-17
tomleader 写道 你这个我做过类似的一个项目,实时性排序要求高,不建议用db做,db只是恢复数据用,排序及前端获取排行列表,我推荐用redis,数据结构采用其内置的sorted list,性能非常好,redis只保存最简单的id+积分这么一个数据,关闭实体化选项,全部用内存来保存数据,搭建主从防止宕机,然后自己实现一个从db到redis的数据恢复过程即可。
数据保存的话,根据你实际并发量考虑,并发不高的话可以定时写入db,并发很高的话,中间需要再做一个缓冲队列。 正解 |
|
返回顶楼 | |
发表时间:2012-02-18
我提一个方案不知道可行性|:
新建一张表 积分值 人数 求排名的时候,只要 select sum(人数) table 积分值 > ## + 1 排名 具体细节实践 可以自己想。 |
|
返回顶楼 | |