关于排名系统的实现

2014-03-13 18:22:42 +08:00
 yueyoum
求助,

用户有各自的积分,然后需要实时根据积分排名。
要求是 相同积分的,能得到相同的排名。

比如 a 积分 10, b 积分8, c 积分8,
那么 a 排名1, b和c排名为2

这时候还要求,如果积分相同,则根据另一个属性来排序。
比如b的那个属性为2, c为1

那么最终排序为 a:1, b:2, c:3

如何实现?
5837 次点击
所在节点    程序员
12 条回复
loading
2014-03-13 18:28:05 +08:00
select 姓名 from 表 order by 积分,另一个属性
huwewa
2014-03-13 18:30:05 +08:00
可以参考云风写的 [谈谈陌陌争霸在数据库方面踩过的坑(排行榜篇)](http://blog.codingnow.com/2014/03/mmzb_db_2.html)
huwewa
2014-03-13 18:31:01 +08:00
:( 回复不支持md?
yueyoum
2014-03-13 18:34:06 +08:00
@loading

尽量避开mysql, 积分和另一个属性会频繁变动, 考虑10w级别用户
yueyoum
2014-03-13 18:36:18 +08:00
@huwewa

thanks,那篇文章我看过。 可能是我没细看的原因,

其中云风提到 他们的积分上限是 5000,是可控的,

但这里的积分 不一定啊…………
loading
2014-03-13 19:26:52 +08:00
@yueyoum 哦,我错误估算您的水平了,抱歉!!!
首先要看你的实时性有多高要求。
内存数据库+node.js?
guoxx_
2014-03-13 20:48:22 +08:00
10W级别的用户完全可以把这部分数据缓存在内存中,根据自己的算法做排序。完全不依赖于数据库。
服务启动的时候排一下序就可以了。

如果a属性重复的可能性比较小,用a属性做二叉树排序。
更复杂的算法就需要具体业务具体分析了。
pubby
2014-03-13 23:42:12 +08:00
@yueyoum "尽量避开mysql, 积分和另一个属性会频繁变动, 考虑10w级别用户"

这么点数据,mysql 内存表也可以试试看
thwawar
2014-03-13 23:45:03 +08:00
首先,应该把数据全放内存里。MySQL的大部分存储引擎中索引的数据结构都是基于B树的,但是B树是面向磁盘的数据结构,内存里的应该用二插树来做,为了防止最坏情况出现,所以要用自平衡的二叉树比如红黑树来实现。
yueyoum
2014-03-19 11:22:14 +08:00
前几天忙其他事情, 昨天才把这个弄完了。

见 APPEND
mouer
2014-03-19 11:28:37 +08:00
其实吧,没有那么麻烦,参见码农第一期,我们用的是树形分区设计
yueyoum
2014-03-19 11:30:09 +08:00
啊, 其实我做完后突然发现其实是没用的。

既然我的 lua script 已经默认了 是定时统计排名

那么完全只用记录用户的积分,然后定时取出全部用户,再在python中直接排序就行…………

too young too simple ...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/104184

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX