2014-12-19 91 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