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

关于 reddit 排名算法具体实践的求助?

  •  
  •   polandeme ·
    polandeme · 2016-09-06 23:40:11 +08:00 · 2847 次点击
    这是一个创建于 3010 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据库关键字段:up 、 down 、 time 、 rank

    现在情况是 reddit 的数学公式是有的。参考

    目前采用的方案是按时间查询出来 20 条,然后再把这些按照按照上面的数学公式给 rank 赋值,最后使用快排,排列 rank.

    但是感觉这样问题还是挺多的:

    1. 排序算法只是在某个时间段内的排序,没有在时间段的不一定不在这一次排序内
    2. 效率不是太高

    所以有没有一个比较合适的方法,能够让库里面所有的都按照这个数学模型排序?就是 sql 语句的 order by 是按照计算之后的值

    能够想到的方法:

    1. sql 语句(不是太熟)
    2. 使用缓存 redis
    3. 视图?
    14 条回复    2016-09-08 09:35:58 +08:00
    cctvsmg
        1
    cctvsmg  
       2016-09-06 23:46:28 +08:00
    在 select 里面计算排序公式,作为一个值,然后 order by 这个值
    aisk
        2
    aisk  
       2016-09-07 00:17:49 +08:00
    大概看了一下,这个只需要在投票的时候重新算一下帖子的分数,写进数据库就好了,查询直接 order by score 即可。
    9hills
        3
    9hills  
       2016-09-07 00:28:37 +08:00 via iPad
    定时计算,然后存到缓存中供排序使用即可。用 redis 的话排序都省了,只需要定时更新 score 即可

    这个本身并不是一个强时效的需求,定时计算即可
    polandeme
        4
    polandeme  
    OP
       2016-09-07 09:52:38 +08:00
    @cctvsmg 开始一直是想着这个思路,但是 sql 语句不熟,查了好久没找到合适的。有没有合适的资料推荐。
    polandeme
        5
    polandeme  
    OP
       2016-09-07 09:52:53 +08:00
    @aisk 准备试试这个方案。谢谢
    polandeme
        6
    polandeme  
    OP
       2016-09-07 09:53:43 +08:00
    @9hills 有想过,但是对定时,这个时间频度不好确定,而且这样会不会影响性能?
    9hills
        7
    9hills  
       2016-09-07 10:09:16 +08:00   ❤️ 1
    @polandeme
    一种是时间触发,一种是 vote 触发。

    在大部分系统中, vote 的频率远大于 1qps 。既然你可以接受 vote 触发,还不如修改为定时触发。。 1s 或者 10s 一次
    polandeme
        8
    polandeme  
    OP
       2016-09-07 10:35:37 +08:00
    @9hills 明白了,现在采用了 vote 的触发,这样就暂时不在中间加一层 redis 了,目前是 mysql 数据库。
    对 redis 这种其实并没有具体应用过,先去看看,回头去做一下对比,顺便学点东西。

    谢谢
    9hills
        9
    9hills  
       2016-09-07 10:38:01 +08:00 via Android
    @polandeme 嗯,看你的量级,量一上来 MySQL,肯定是扛不住的
    polandeme
        10
    polandeme  
    OP
       2016-09-07 10:43:12 +08:00
    @9hills 恩恩,迭代替换吧。
    aisk
        11
    aisk  
       2016-09-07 15:13:48 +08:00
    说按时间触发的都是糊弄楼主的。
    polandeme
        12
    polandeme  
    OP
       2016-09-07 18:31:40 +08:00
    @aisk 怎么说?
    aisk
        13
    aisk  
       2016-09-07 21:39:52 +08:00
    @polandeme 你现在有一百万贴,要保证算法不失真,每次跑脚本都要重新算一下每个帖子的 score ?
    polandeme
        14
    polandeme  
    OP
       2016-09-08 09:35:58 +08:00
    @aisk 恩恩,所以按照 vote 触发计算会是比较好的一个逻辑?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6019 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:25 · PVG 10:25 · LAX 18:25 · JFK 21:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.