2010-07-29 75 views
2

我正在为我的报纸网站创建一个Django驱动的网站。如何最好地为页面的侧边栏生成“顶级文章”列表,这是我在获取网站时遇到的最不明显和常识性的任务。Django中动态创建的热门文章列表?

首先想到的是某种数据库列,它随每个视图而更新(基于什么?)。这似乎(根据我的直觉)可笑的数据库密集和不切实际,因此我想我想找到另一种解决方案。

谢谢大家。

回答

1

我会给celery试试(用django-芹菜)。尽管配置和用作缓存并不那么容易,但它使您能够像增加计数器一样排列任务并在后台执行它们。它甚至可以与高速缓存技术结合使用 - 在缓存中的增量计数器中定义PeriodicTask,然后定期运行,重置计数器并将它们写入数据库。

我只记得 - 我曾经发现this blog entry,它提供了一种很好的方式,用AJAX JS调用在数据库中增加'viewed_count'(或类似的)列。如果你的交通不繁忙,这可能是个好主意?

在这篇文章中还提到django-tracking,但我不太了解它,我从来没有用过它(但)。

0

如果您按照顶部视图进行排序,那么如果您在数据库中为视图列编制索引,这将会很快。另一种选择是每小时只收集前x篇文章,然后将这个值传递给Django的缓存框架。

关于缓存列表的好处在于,用于确定顶级文章的算法可以像您喜欢的那样复杂,而不会在每个页面视图中都难以打开数据库。 Django的缓存框架可以使用内存,数据库或文件系统。我更喜欢DB,但其他许多人更喜欢内存。我相信它使用了pickle,所以你也可以直接存储Python对象。这很容易使用,推荐。

0

一个索引不会帮助,因为他们的主要问题我相信没有那么多得到排序列表有一个DB写与每页查看的文章。另一个指标实际上使问题变得更糟,尽管只有一点。

所以我会去缓存。我认为django的缓存填充在这里是一个问题,因为它需要在所有键上超时。我不确定这是否是memcached强加的,如果不是的话,请使用redis。实际上,只要使用redis就可以了,python库非常棒,我之前从django项目中使用过它,它具有原子增量和强大的排序功能 - 您需要的一切。

1

不成熟的优化,首先尝试数据库的方式,然后看看它是否真的太过数据库敏感。任何体面的数据库都有非常好的缓存,它可能无关紧要。即使这是一个问题,请看看这里的其他数据库/缓存建议。

很可能顺便说一下,您将拥有比每个视图更多的密集型db查询,而不是简单的视图更新。