Php Reddit和Hacker新闻排名算法是如何使用的?

Php Reddit和Hacker新闻排名算法是如何使用的?,php,mysql,ranking,Php,Mysql,Ranking,我最近一直在研究排名算法,特别是Reddit和Hacker News使用的算法。算法本身很简单,但我不太明白它们是如何使用的 我可以做的一件事是直接在SQL中实现该算法,这样每当用户进入显示排名文章的页面时,类似这样的操作都会运行: SELECT thing1, thing2 FROM table ORDER BY ranking_algorithm DESC LIMIT page*20, 20 有几个类似的问题,但给出的唯一答案是将排序算法放在SQL查询中。然后线就死了 在较小的范围内将算法

我最近一直在研究排名算法,特别是Reddit和Hacker News使用的算法。算法本身很简单,但我不太明白它们是如何使用的

我可以做的一件事是直接在SQL中实现该算法,这样每当用户进入显示排名文章的页面时,类似这样的操作都会运行:

SELECT thing1, thing2 FROM table
ORDER BY ranking_algorithm DESC
LIMIT page*20, 20
有几个类似的问题,但给出的唯一答案是将排序算法放在SQL查询中。然后线就死了

在较小的范围内将算法放入SQL查询,但是如果网站有大量用户和大量帖子,该怎么办?这意味着,每当任何用户打开显示排名文章的页面时,该查询都将运行。那不是很有效率

现在,Reddit和Hacker News不再以SQL查询的形式运行排名算法,而是分别以python和ark的形式运行。那么,它们究竟是如何以及何时使用的呢

一种可能的解决方案是从每篇文章中获取所有相关信息,并将其存储在web服务器上的某个数据结构中。然后对该数据结构进行排序和排序

每次有人打开显示排名文章的页面时,您只需转到数据结构,检索正确的文章范围,并显示它们

然后每隔半个小时左右,从服务器检索最新的信息,对其进行排序、排序,并更新数据结构

其他成本较低的查询,如检索和显示特定帖子中的所有信息,或显示最新帖子(与得分最高的帖子相反),可以在每次打开相关页面时用SQL完成


这样做的好处是,您的数据库每半小时只被点击一次(对于昂贵的排名查询)。缺点是需要复制数据库中的一大块数据。

Reddit使用Pyrex,排序算法是Python C的扩展,用于提高性能

因此,当记录被更新时,您可以在SQL中执行相同的操作,pex:when是up还是down

必须转换为SQL引擎语法的伪代码:

function hot(ups, downs, date){
    score = ups - downs;
    order = log(max(abs(score), 1), 10);
    if (score>0){
        sign = 1;
    } else {
        if (score<0){
            sign = -1;
        } else {
            sign = 0;
        }
    }
    td = date - datetime(1970,1,1);
    seconds = td.days * 86400 + td.seconds + (float(td.microseconds) / 1000000) - 1134028003;

    return round(order + sign * seconds / 45000, 7);
}
功能热(上升、下降、日期){
分数=上升-下降;
顺序=对数(最大值(abs(分数),1),10);
如果(分数>0){
符号=1;
}否则{

如果(score我为视频聚合器实现了Reddit排名算法的SQL版本,如下所示:

SELECT id, title
FROM videos
ORDER BY 
    LOG10(ABS(cached_votes_total) + 1) * SIGN(cached_votes_total)   
    + (UNIX_TIMESTAMP(created_at) / 300000) DESC
LIMIT 50
每当投下新的一票时,缓存的投票总数都会由触发器更新。它在我们当前的站点上运行得足够快,但我计划添加一个排名值列,并使用与缓存的投票总数列相同的触发器进行更新。优化后,对于大多数任何大小的站点,它都应该足够快


编辑:关于s是什么的更多信息?我在代码段中没有看到它的定义,所以你的答案是在有向下投票/向上投票时运行该函数?hotscore是时间的函数,因此即使没有向上投票/向下投票,分数也会改变。你是说黑客新闻算法吗?在Reddit算法中,分数不会随着时间的推移而降低ime过去了,但新的故事会比旧的故事得到更高的分数。@Kijote如果你把我的名字放在乞讨处,这样我就能收到通知,那么你的评论本可以帮我省下很多工作。出于某种原因,我认为他们git中的日期是java System.currentTimeMilli()的python等价物。无论如何,谢谢。顺便说一句(我知道它有点宽泛)但是你会喜欢reddit algo还是hacker's news?@Ced很抱歉,我没有分析hacker news算法,但我认为一次又一次的计算。如果我没有错的话,我认为最好像reddit算法在上/下投票时那样只计算一次分数(数据库中只影响一个寄存器,而不是多次更新).同样,这是一种推测,我还没有分析过源代码。我最后写了一篇文章,如果有人想要更多的信息(和更好的代码)我的链接文章所在的博客已不存在,因此我对其进行了一些编辑并将其移动到此处:指向您文章的链接已失效。是否有镜像?@Petrichor我刚刚迁移了服务器,但我的设置似乎没有正确传播。请尝试以下操作: