【问题标题】:Asp.Net Session Object PriorityAsp.Net 会话对象优先级
【发布时间】:2016-01-05 07:07:12
【问题描述】:

我们目前正在构建一个应用程序,在该应用程序中,我们严重依赖为每个用户存储会话中的数据。我们不能使用缓存,因为这些数据是特定于用户的,并且在需要时重新查询数据是一个昂贵的过程:因此解决方案是从数据库中查询一次,存储到会话中,然后继续使用它直到会话结束.我担心的是,当内存中存储了太多会话数据时,IIS 如何处理这些会话。

  1. 何时知道何时清除会话数据?
  2. 如果内存不足,它如何确定首先清除哪个会话变量?
  3. 有没有办法为单个会话对象设置优先级:首先清除优先级较低的数据。

【问题讨论】:

    标签: asp.net session caching iis


    【解决方案1】:

    您正在做的是使用InProc 会话,会话存储在当前工作进程的内存中。

    1. 什么时候知道什么时候清除会话数据?

    InProc 会话被清除,如您所料,当在配置的会话超时长度内对会话发出零个请求时。

    <sessionState mode="InProc" timeout="30"/>
    

    但这不是一个确切的持续时间。会话将在超时后被清除,但仅当会话处理程序的内部机制触发清除时。每个会话都没有自己的计时器轮询会话超时。它会在最适合的时候完成。

    您还应该注意,由于工作进程会定期回收,因此存储在该进程中的所有会话都将被删除。 InProc 会话也不会在网络农场中工作,因为每个请求都可以由不同的机器处理。

    1. 如果内存不足,它如何确定首先清除哪个会话变量?

    它没有。它将像任何其他 Windows 进程一样简单地转向使用虚拟内存,因此您现在将使用基于磁盘的虚拟内存而不是基于芯片的内存来支持您的会话。最终整个过程将被回收,一切都将按照 1 进行擦除。

    1. 有没有办法为单个会话对象设置优先级:首先清除优先级较低的数据

    InProc 不是开箱即用的。最终,会话只是存储对象,因此您可以根据对您的应用程序有意义的任何内容运行自己的清理,只需使用某种值标记您的 InProc 对象。但是您很快就会简单地复制已经可用的功能,而且可能不如 MS 做得好。

    查看System.Web.SessionState namespace 了解一些选项,但请记住,使用InProc 时,您总是会被工作进程回收勒索赎金,这可能由许多不同的事情触发:防病毒软件重置网络上的时间戳.config 文件为例。

    有关InProc 会话的可行且流行的替代方案,请查看Redis

    【讨论】:

    • Rism,感谢您提供的信息。您提到如果工作进程确定需要,它将在磁盘中备份会话数据,那么假设会话数据不会消失,除非达到超时、触发进程回收或用户关闭浏览器,是否安全?我担心的是,当应用程序投入生产时,我们估计大约有 700 个并发用户,并且由于内存不足,大量会话可能会意外清除。
    • 它不会“备份”它只会按照正常的虚拟分页等溢出。我根本不会依赖InProc。如果工作进程只回收一次,有 700 个并发用户,那就是 700 个会话丢失。砰!一击,您只需 %^$ 和 700 个用户关闭。你为什么要对他们和你自己那样做?
    猜你喜欢
    • 2020-10-09
    • 2013-06-03
    • 2015-08-27
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多