2010-11-16 78 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