2009-08-29 28 views
5

我有以下想法:假設我們有一個使用django編寫的Web應用程序,它模擬某種公告板。這個委員會有許多線程,但其中幾個人每小時獲得最多的帖子/觀看次數。 對於每個用戶來說,線程頁面看起來有點不同,所以你不能將整個渲染頁面緩存爲整體,只緩存渲染頁面的某些部分也不是一個選項。Django中對象的對象存儲請求

我的想法是:我創建的線程的存儲器中的對象結構(與每一個柱和需要顯示它的其他數據)。如果發佈新消息,則更新結構並且每發佈X個帖子(或者每Y分鐘,無論先發生什麼),則新消息被寫回數據庫。如果應用程序崩潰,某些帖子會丟失,但這絕對沒問題(對於用戶和管理員)。

問題:我可以在沒有序列化的情況下創建如此持久的內存存儲(so no serialize-> memcached)?據我瞭解,WSGI應用程序(如Django)在連續的過程中運行,而不會在請求之間關閉,因此理論上應該是可能的。有沒有我可以使用的API?如果不是:有什麼意思?

/EDIT1:我知道,「老大難」,通常有不同的含義,但在這種情況下,我嚴格地表示「在請求之間」。

+4

序列化有什麼問題?你有沒有分析你的應用程序?數據庫I/O是瓶頸嗎? –

回答

5

在生產WSGI環境中,您可能會有多個工作進程同時爲請求提供服務。這些工作進程會不時被回收,這意味着本地內存對象將會丟失。但如果你真的需要這個(並確保你這麼做),我建議你看看Django的caching framework,檢查本地內存緩存。另外,看看sessions

但即使在本地內存緩存使用序列(與pickle)。通過實現自定義緩存後端,可以輕鬆實現本地內存緩存而無需序列化(請參閱the docs)。您可以使用locmem.py中的代碼作爲創建無序列化緩存的起點。

但我懷疑你在這裏做了一些過早的優化?

+0

我讀過將大對象放入會話中是一個壞主意,是否存在某種軟大小限制,您應該避免會話並使用緩存?你如何將會話與存儲在緩存中的特定對象相關聯?如果您確實有關聯並且會話過早結束,您將如何清除緩存中的關聯對象? – bischoffingston

0

內存中的內存不是永久的,所以沒有。

我想你的意思,你只需要寫入數據庫不斷X對象的新職位。我想這是爲了加速的原因。但是因爲無論如何你遲早需要序列化它們,所以你實際上並沒有時間存儲。但是,通過不將新對象刷新到磁盤,您將節省時間,但大多數數據庫已經支持該功能。

但你也談論緩存呈現的頁面,這是讀取緩存。在那裏你不能緩存你說的完成的結果,但是你可以緩存數據庫查詢的結果。這意味着新消息不會立即更新,但需要一分鐘左右才能顯示,但我認爲大多數人會認爲這是可以接受的。

更新:在這種情況下不是,那麼。但是,您仍然應該可以輕鬆地緩存查詢結果,但在添加新響應時會使該緩存無效。這應該有所幫助。

+0

我認爲我很清楚,我的意思是「在請求之間」與「持久性」。實際上,最後一點是我在存儲器中考慮過這個問題的原因。新帖子需要立即顯示,所以我不能依賴任何讀取緩存,但需要在每個請求上(幾乎)呈現頁面。當然,會有一些請求可以通過緩存頁面完成,但其中大多數不會。 –

+0

好吧,如果寫入磁盤是瓶頸,那麼你就是在這裏深陷困境。 ;)但是對於閱讀,您應該可以擁有在寫入新響應時無效的memcache。 –