2010-11-16 71 views
1

我在Django中實現了一個聊天系統。在Django中實現聊天的最佳實踐(存儲在線用戶)

我在決定如何創建決定誰是在線用戶的模型方面遇到了一些麻煩。有兩個問題我看到:

  1. 當用戶下線
  2. 我想要的「用戶」是輕量級的(沒有登錄必要的),這意味着我不希望你真的不能告訴使用Django的用戶系統。

有關如何進行建模的建議?

回答

1

將此信息存儲在緩存中。這是短暫的,它不屬於長期數據庫,訪問需要非常快速。

您不需要存儲大量信息來處理聊天會話,因此將其存儲在用戶的會話中(您可以使用匿名未登錄的用戶執行此操作,然後從「真實「用戶表,如果他們碰巧登錄)是正確的路要走,只要你使用純粹的緩存會話後端和類似的memcached。

+0

我對緩存後端不太熟悉。它會讓我存儲這種信息並從不同的會話訪問它嗎?我不能將它保存在一個用戶的會話中,因爲所有用戶都需要「知道」誰在線。 – 2010-11-16 10:29:59

+0

有關整體信息,請將其直接存儲在緩存中。有關特定於個人用戶的信息(如聊天首選項),請將其存儲在用戶會話中。 – 2010-11-16 13:28:27

0

我同意Pail McMillan的答案,即使用緩存是正確的方法。在過去,我使用了Django's low level caching API,它只允許您集中存儲鍵值對。

我不知道如何有效的,這將是,但你可以很簡單地存儲一個逗號分隔這是當前在線的用戶ID的字符串:

from django.core.cache import cache 

cache.set('users-online', '4,6,12,34') 

然後:

for user_id in cache.get('users-online').split(','): 
    user = User.objects.get(pk=user_id) 
    # do something with the user ... 
+0

你甚至不需要那樣做。你可以直接存儲任何pickleable對象 - 緩存api會爲你處理它。 – 2010-11-16 13:30:45

+0

,那樣會非常低效,因爲它會爲每個在線用戶觸發一個單獨的查詢。更好地存儲緩存中所需的任何信息,並在用戶登錄時更新。 – 2010-11-16 13:31:45

+0

正確,儘管您可以通過此界面將東西存儲在緩存中。 – 2010-11-16 16:05:14