如何合并Reddit页面/帖子排名算法?

时间:2012-10-01 03:32:30

标签: php mysql algorithm

我正在尝试学习如何对像Reddit.com这样的网站算法进行编码,其中有数千个帖子需要排名。他们的排名算法就像这样(你不必阅读它,它更像是我的一般性问题):http://amix.dk/blog/post/19588

现在我有一些存储在数据库中的帖子,我记录了他们的日期,他们每个都有一个upvotes和downvotes字段,所以我正在存储他们的记录。我想知道你如何存储他们的排名?当特定帖子具有排名值,但它们随时间变化时,您如何存储其排名?

如果没有存储,那么每次用户加载页面时,您是否对每个帖子进行排名?

你什么时候存储帖子?你是否运行一个cron作业来每隔x分钟自动为每个帖子提供一个新值?你存储它们的价值吗?这是暂时的。也许,直到那篇文章达到最低分并被遗忘?

3 个答案:

答案 0 :(得分:6)

我绝对不会在每次显示它们时计算它们的等级。

一个简单但不太高效的解决方案是缓存帖子排名,一旦帖子的排名发生变化,您就可以清除或刷新缓存。

这不太理想,但有可能。

另一种方法是按照你的提法做:在数据库中计算和存储排名(理想情况下缓存它们),然后每x分钟使用一次cron作业刷新这些排名。

同样,这些是您想要做的基本方法。然后,您可以随着时间的推移建立它们。

您选择的算法很可能非常适合您的需求。

您还需要衡量您的网站将获得哪种流量,因为它会决定您应该通过哪种长度来获得正确的算法。

答案 1 :(得分:2)

我会立即按时间加权的比例计算单票的得分。我会将该分数发送到队列中,或者使用它来增加一个字段,具体取决于您的性能。

按照常规时间间隔,我会在时间窗口内收集所有当前排名的文章和所有收到投票的文章,然后重新排列所有排名的文章,然后按照得分的降序排列所有排队的文章,直到我计算得足以填写我的排名配额。

排名列表将被缓存并使用,直到下一个排名周期。您必须根据您的站点负载调整队列保留期(可能是在最后N个队列中有活动的任何内容重新排队),保留文章等,但这应该是一个表现良好的起点。

答案 2 :(得分:1)

如果您正在使用reddit使用的确切算法,则只需在项目上调或下调时更改排名字段 - 实际上只有当upvotes和downvotes之间的差异发生变化时才会发生变化。本文将详细介绍他们的排名如何运作。

http://bibwild.wordpress.com/2012/05/08/reddit-story-ranking-algorithm/

基本上,上下投票仅用于“取代”这些职位。 如果D是upvotes和downvotes的数量之间的差异,那么帖子每D个数量级上下移动12小时。除此之外,它只是一个简单的时间排名。


如果您想使用自己的排名系统,其中帖子的年龄不是线性的,那么您必须创建一个索引字段并按照时间间隔重新计算排名,或者只是正如我在评论中所说的那样,将您的排序放入SQL查询中。但是很有可能,你可以找到一种不必一遍又一遍地重新计算的方法。