使基于SQL的活动源更快的好方法

时间:2012-12-28 17:04:20

标签: python sql django redis news-feed

需要一种方法来提高我网站基于SQL的活动源的性能。我们在Heroku上使用Django。

现在我们正在使用actstream,它是一个Django应用程序,它使用Django ORM中的通用外键来实现活动源。基本上,每个动作都有其actor的通用外键以及它可能正在执行的任何对象,如下所示:

操作:   ( Clay - 演员)写了一篇(评论 - 动作对象)( Andrew对星巴克的评论 - 目标

随着我们的扩展,它变得太慢,这是可以理解的,因为它依赖于庞大,昂贵的SQL连接。

我至少看到两个选项:

  1. 将Redis图层放在SQL数据库的顶部,并从那里获取活动源。
  2. 尝试绕过Django ORM并在原始SQL中执行所有查询,我了解这些查询可以提高性能。
  3. 任何人都会对这两者中的任何一个或其他想法有所了解,我很乐意听到它们。

3 个答案:

答案 0 :(得分:1)

您可能希望查看物化视图。由于你使用的是Heroku,并且通常使用PostgreSQL,你可以查看Materialized View Support for PostgreSQL。它不像其他数据库服务器那样成熟,但据我所知,可以使它工作。要使用Django ORM,您可能必须为feed创建一个新的“实体”(不熟悉Django,因此需要根据需要进行修改),然后对它进行查询,就像它是一个表一样。手动管理视图是一个考虑因素,因此在您提交之前请仔细查看。

希望这有帮助!

答案 1 :(得分:1)

你说redis? redis的一切都更好。

缓存是软件开发中最好的创意之一,如果你使用Materialized Views,你也应该考虑尝试缓存那些,相信我你的用户会注意到它们之间的差异。

答案 2 :(得分:1)

采用一种方法将两种建议结合起来。

我们创建了数据库中每个操作的主列表,其中包含了我们所需的有关操作的所有信息,并将其粘贴在Redis中。给定一个动作ID,我们现在可以查看Redis并获取一个准备好返回到前端的字典对象。

我们还创建了动作ID列表,这些列表对应于用户可用的所有不同类型的活动流。因此,给定用户ID,我们有他的朋友的活动,他自己的活动,喜欢的地方活动等,可供查找。 (我猜这些与物化视图有些对应,虽然它们在Redis中,而不在PSQL中。)

因此,我们将用户的Feed作为操作ID列表。然后,我们通过查看主操作列表中的ID来获取这些操作的详细信息。然后我们将Feed返回到前端。

感谢你们提出的建议。