【问题标题】:Static list<User> VS DataBase for Online Users in Asp.Net?Asp.Net 中在线用户的静态列表<用户> VS 数据库?
【发布时间】:2011-07-05 06:49:28
【问题描述】:

我正在构建 ASP.Net MVC 应用程序“有点游戏”,它与在线用户打交道

我每"10s" 向一些Action 发起Ajax 请求,以便在用户保持网站打开时保持用户在线。 这个Action 更新 LastActivityDate 这个User -((在静态列表和数据库中))。


所以问题是:

  • 最好将在线用户存储在静态列表中,并在用户登录时编写一些代码将他添加到该列表中,然后每隔"10s"管理此列表以踢出离线用户.
  • 或者最好是加载在线用户 来自数据库,只要我想OnlineUsers


注意:我正在使用 SO Question 中的技术来执行一些定期任务,例如重新管理 OnlineUsers 静态列表。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-membership


    【解决方案1】:

    首先,您不会为此使用List&lt;User&gt;,而是使用Dictionary&lt;int,User&gt;,使用用户的id 作为键,这样您就可以立即找到要更新的用户。其次,我认为这可能是两者的混合。您保留当前用户的缓存副本,定期从数据库刷新,并将数据(如果需要,异步)持久保存到数据库。如果您发现您在代码的不同位置执行此类操作,您可能需要考虑为用户定制一个封装此行为的持久性类。

    【讨论】:

    • 谢谢,Dictionary&lt;string,User&gt; 的用户名怎么样,因为我的 userIDGUID 所以字符串作为键有问题吗?
    • @Wahid -- 只要它们是独一无二的,就可以正常工作。
    【解决方案2】:

    如果您打算拥有大量用户,并且需要经常从数据库中提取数据,最好将用户列表存储在Cache 中。显然,这将存储在服务器的内存中,因此您不希望存储大量对象,但如果它只是一个简单的在线用户列表,那应该不是问题。

    【讨论】:

    • 可能在缓存中,而不是在会话中,因为会话是每个用户的,并且您不希望在每个用户的会话中存储所有用户的副本。此外,LastActivityDate 的用途可能不仅仅是当前用户列表,因此您最终需要保留该值。
    • 但静态类或列表在所有用户之间共享,无需关心缓存过期时间“或会话”。那么为什么不直接使用呢??
    【解决方案3】:

    静态的范围始终是操作系统中运行的进程的范围。所以在桌面应用程序中使用静态是有意义的。但是,我发现对服务器端应用程序使用静态有点随意,因为您不控制进程。这是执行此操作的 Web 服务器。如果流程意外结束怎么办?或者,如果有许多进程为您的应用程序提供服务怎么办?

    所以,数据库的使用是不可避免的。不过,您可以将静态范围作为临时缓存,但不能依赖它。

    【讨论】:

    • 如果在线列表崩溃了,我会尝试添加一些逻辑来重新加载在线列表是否足够??
    • 是的,当然很好。唯一需要注意的是缩放。如果您的应用程序需要多个服务器(即多个进程),那么静态范围是不可能的。但只要一台服务器就足够了,就没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2011-09-08
    相关资源
    最近更新 更多