2014-12-19 94 views
2

所以我有一个网站,在每个用户的基础上,它预计会查询一个非常大的数据库,并翻阅结果。由于返回的条目数量很大,我只运行一次查询(这需要一些时间......),将结果存储在全局中,并让人们按照他们的需要迭代结果(或下载它们)。持久对象与Django?

当然,这是不可扩展的,因为全局变量是跨会话共享的。在Django中做到这一点的正确方法是什么?我看了会话管理,但我总是碰到“xyz不能在json上序列化”的问题。我是否正在研究如何正确使用会话来做到这一点,还是有另外一种首选的方法来做到这一点?

+1

为什么你不使用缓存层? Memcached,redis等 – Bryan 2014-12-19 04:05:45

+0

这是每个人都一样的查询吗? – Anentropic 2014-12-19 04:16:54

+0

您可以使用数据库作为缓存层 - 将最初的“努力工作”查询的结果保存到一个新表中,然后从该表中检索结果并且您仍然可以进一步筛选它们通过SQL/ORM,这是你放弃了,如果你使用了一个单独的缓存层(并且避免了整个序列化问题) – Anentropic 2014-12-19 04:23:43

回答

1

如果用户正在翻阅结果,那么您可能不想拉回来并渲染超过必须的东西。大多数SQL语言都有TOPLIMIT子句,只要您的数据排序一致,就可以让您回退有限范围的结果。 Django的分页类在Django Model类上是一个很好的抽象:https://docs.djangoproject.com/en/dev/topics/pagination/

我会小心地在用户会话中存储大量数据,因为它不会随着用户数量的增长而扩展,而且用户会话可以在用户离开网站后留待一段时间。如果您设置了此选项,请确保您阅读了有关清除过期会话的信息。 Django不会为你做: https://docs.djangoproject.com/en/1.7/topics/http/sessions/#clearing-the-session-store