论坛首页 Java企业应用论坛

网站实时积分排名

浏览 11525 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-02-16  
  最近遇到一个问题就是根据需求需要对所有的用户根据积分,显示他的全站排名,数据量大概200万左右,积分是实时更改的,怎么能让这个排名尽量的实时呢?一直很困惑,之前用过db的count查,速度很慢,并且高峰时候db也容易堵住,大家有没有什么好的方法,推荐一下。
   发表时间:2012-02-16  
冗余保存积分,有变动时实时更新。排序用order by 。。。。。

0 请登录后投票
   发表时间:2012-02-16  
通过搜索引擎。

积分变更 动态更新索引文件。

0 请登录后投票
   发表时间:2012-02-16  
xieboxin 写道
冗余保存积分,有变动时实时更新。排序用order by 。。。。。



不是很懂,能否说的详细点,至少直接select count() from table where score>? order by score desc 这样不行。
0 请登录后投票
   发表时间:2012-02-16  
ben.lee 写道
通过搜索引擎。

积分变更 动态更新索引文件。



搜索引擎,可以拿到排序吗?能否详细讲一下
0 请登录后投票
   发表时间:2012-02-17  
你这个我做过类似的一个项目,实时性排序要求高,不建议用db做,db只是恢复数据用,排序及前端获取排行列表,我推荐用redis,数据结构采用其内置的sorted list,性能非常好,redis只保存最简单的id+积分这么一个数据,关闭实体化选项,全部用内存来保存数据,搭建主从防止宕机,然后自己实现一个从db到redis的数据恢复过程即可。
数据保存的话,根据你实际并发量考虑,并发不高的话可以定时写入db,并发很高的话,中间需要再做一个缓冲队列。
0 请登录后投票
   发表时间: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方便些
0 请登录后投票
   发表时间:2012-02-17  
考虑一下使用key-value数据库 redis,在这里使用sortset存储方式http://redis.io/commands#sorted_set
0 请登录后投票
   发表时间:2012-02-17  
tomleader 写道
你这个我做过类似的一个项目,实时性排序要求高,不建议用db做,db只是恢复数据用,排序及前端获取排行列表,我推荐用redis,数据结构采用其内置的sorted list,性能非常好,redis只保存最简单的id+积分这么一个数据,关闭实体化选项,全部用内存来保存数据,搭建主从防止宕机,然后自己实现一个从db到redis的数据恢复过程即可。
数据保存的话,根据你实际并发量考虑,并发不高的话可以定时写入db,并发很高的话,中间需要再做一个缓冲队列。

正解
0 请登录后投票
   发表时间:2012-02-18  
  我提一个方案不知道可行性|:

            新建一张表   积分值     人数    
            求排名的时候,只要  select sum(人数) table 积分值 > ##     + 1 排名  具体细节实践 可以自己想。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics