V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yueyoum
V2EX  ›  程序员

关于排名系统的实现

  •  
  •   yueyoum ·
    yueyoum · 2014-03-13 18:22:42 +08:00 · 5801 次点击
    这是一个创建于 3899 天前的主题,其中的信息可能已经有所发展或是发生改变。
    求助,

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

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

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

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

    如何实现?
    第 1 条附言  ·  2014-03-19 11:19:40 +08:00
    还是依赖redis做的这个功能

    https://github.com/yueyoum/redis-lua-scripts/tree/master/score_rank

    感觉我就是云风说的菜鸟,不敢自己写东西去持久化数据,
    所以我最终还是选择了用redis ……
    12 条回复    1970-01-01 08:00:00 +08:00
    loading
        1
    loading  
       2014-03-13 18:28:05 +08:00   ❤️ 1
    select 姓名 from 表 order by 积分,另一个属性
    huwewa
        2
    huwewa  
       2014-03-13 18:30:05 +08:00
    可以参考云风写的 [谈谈陌陌争霸在数据库方面踩过的坑(排行榜篇)](http://blog.codingnow.com/2014/03/mmzb_db_2.html)
    huwewa
        3
    huwewa  
       2014-03-13 18:31:01 +08:00
    :( 回复不支持md?
    yueyoum
        4
    yueyoum  
    OP
       2014-03-13 18:34:06 +08:00
    @loading

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

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

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

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

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

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

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

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

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

    too young too simple ...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2668 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:46 · PVG 23:46 · LAX 07:46 · JFK 10:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.