【问题标题】:Alternatives to using session variables in ASP.NET (including MVC)在 ASP.NET(包括 MVC)中使用会话变量的替代方法
【发布时间】:2009-12-08 18:48:11
【问题描述】:

如果以前有人问过这个问题,我深表歉意,但我还没有完全找到我脑海中的具体问题。

对于我正在构建的网站(使用 ASP.NET MVC)- 性能是一个重要特性。此外,该站点有可能托管在应用程序池每 20 分钟回收一次(或者如果达到内存阈值则更快)回收的环境中。我希望完全独立于依赖会话变量,而是将类似 GUID 的值存储在 cookie 中。我的理由是 - 由于 AppPool 回收,我不知道会话将持续多长时间,并且不希望他们的会话过早超时并导致他们不得不重复登录。

cookie 中的 GUID 值将充当我存储类似会话信息(用户 ID 值等)的表的查找键。因此,如果我需要这些数据,我可以从数据库中检索它。我仍然会使用 Session_OnEnd 事件来清除具有超过 20 分钟旧的“最后活动”值的行的会话表(或者无论长会话配置为持续)。所以我想我仍然会使用会话状态,而不是会话变量。

不过,我再次关心的是性能。因此,我很好奇是否有更好的方法可以避免使用会话变量,同时仍然能够了解用户是谁并以“类似会话”的方式管理他们对站点的访问。我仍然是 MVC 的新手,但多年来在 ASP.NET 方面拥有丰富的经验,所以我希望我的问题是有道理的!

编辑:我有点回避想要使用 SQL 会话状态,因为我可能会在共享 sql server 托管环境中,并且不认为我将有一个能够创建/运行作业的登录,如果删除过期的 sql 会话数据等所必需的。在 AppPool 回收场景中依赖 Session_OnEnd 和 cookie 是否有任何真正的缺点?当 AppPool 回收时,Session_OnEnd 是否不会为当前会话执行?

【问题讨论】:

    标签: asp.net-mvc performance session-state session-variables


    【解决方案1】:

    你假设会话只存储在工作进程中,你可以有 SQL 状态会话,check this link before going any further

    【讨论】:

    • 也称为 SQL 和 Cookie。
    • +1:如果您使用 SQL 状态持久性,您不必滚动自己的数据库
    • 我知道 SQL 会话状态 - 我想我只是相信我听到的 FUD 表现不佳。如果性能很重要,它是一种选择吗?
    • 对 SQL 的任何调用都会比对 sys 内存的调用慢。
    • 排除比较后,怎么会变慢?据说池不断回收,重新启动后持续存在,这使得 SQL 状态管理成为块中的胖子。顺便说一句,Session_OnEnd 不适用于 SQL 状态管理stackoverflow.com/questions/1445803/…
    【解决方案2】:

    使用数据库提供跨网络农场/花园的“持久”持久性是一种常用技术。还有distributed caching systems 可用于使会话状态数据跨服务器和重新启动可用。

    例如,我见过的分布式系统之一使用 UDP 在多个服务器之间共享会话数据。我预计分布式缓存会带来一些性能优势,因为数据存储在服务器的内存中,因此无需进行数据库查找。

    【讨论】:

      【解决方案3】:

      如果您不能使用进程内状态,则必须恢复到外部存储库,这很可能是数据库。

      那么为什么不将会话状态存储在数据库中呢?对此有内置支持,它有效地解决了回收问题,同时在会话状态保持较小的情况下保持可接受的性能。

      【讨论】:

      • “会话状态保持较小”-您对此的定义是什么?会话变量的数量小于 2? 10 点?
      • 不是绝对数量,而是它们的类型。当它们不在进程中时,它们需要可序列化,因此您应该注意序列化的对象图很小。
      • 我只会使用简单类型 - String、DateTime、Int 等。它们都是可序列化的类型,对吧?
      • 对,而且这些实际上很便宜(假设您不存储包含很多元素的数组)。
      【解决方案4】:

      研究自定义缓存机制。就像您说的那样,您不能使用会话变量,因为听起来您的网站将进行负载平衡?由于从应用程序池中回收,会话可能会发生变化。您也不想要 View State 的开销(您可以使用它,但它会影响性能)。

      缓存与其他提到的模型之间存在三个主要区别:

      1. 缓存是线程安全的
      2. 缓存中的项目会自动删除
      3. 缓存中的项目支持依赖项

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-27
        • 2018-09-10
        • 2010-11-19
        • 2018-05-20
        • 2018-01-15
        • 2012-12-19
        • 1970-01-01
        相关资源
        最近更新 更多