7

我正在尝试学习如何编写像 Reddit.com 这样的网站算法,其中有成千上万的帖子需要排名。他们的排名算法是这样工作的(你不必阅读它,它更像是我的一个普遍问题):http ://amix.dk/blog/post/19588

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

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

你什么时候存储这些帖子?您是否运行 cron 作业以每 x 分钟自动为每个帖子赋予一个新值?你存储它们的价值吗?这是暂时的。也许,直到该帖子达到其最低分数并被遗忘?

4

3 回答 3

6

I would definitely not calculate their rank every time you display them.

A simple, and not so performant solution would be to cache post rankings, and once one post's ranking changes, you clear or refresh the cache.

That is not ideal, but it is possible.

Another way would be to do as you alluded to: calculate and store ranks in the database (and ideally cache them), and then refresh those rankings using a cron job every x minutes.

Again, these are basic approaches to what you want to do. You can then build on them over time.

The algorithm you choose will most likely be very particular to your needs.

You need to also gauge what kind of traffic your site would be getting, as it would dictate what kind of lengths you should go through to get the right algorithm.

于 2012-10-01T03:40:42.247 回答
2

我会立即在时间加权尺度上计算单票的分数。我会将该分数发送到队列中或使用它来增加一个字段,具体取决于其中哪一个对您来说是有效的。

在固定的时间间隔内,我会取出所有当前排名的文章和在时间窗口内获得投票的所有文章,然后按分数降序对所有排名文章和所有排队文章进行重新评分,直到我计算出足够的排名配额.

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

于 2012-10-01T03:49:56.123 回答
1

如果您使用 reddit 使用的确切算法,您只需在项目被投赞成票或反对票时更改排名字段 - 实际上只有当赞成票和反对票之间的差异改变数量级时。本文进一步解释了他们的排名如何运作。

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

基本上,赞成票和反对票只会“取代”职位。如果 D 是赞成票数和反对票数之间的差值,则帖子每 D 的数量级向上或向下移动 12 小时。除此之外,这只是一个简单的时间排名。


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

于 2012-10-01T06:10:25.477 回答