我正在构建一个大型应用程序,我通常使用一个简单的会话来存储私有全局信息,但是由于应用程序可能相当大,我相信这可能是一个问题,因为它可能具有大量的内存会话。
有没有更好的方法来存储这些变量?
例如,当用户登录时,我想存储有关该用户的数据并将其显示在需要的地方,而不必每次都查询数据库。
我正在构建一个大型应用程序,我通常使用一个简单的会话来存储私有全局信息,但是由于应用程序可能相当大,我相信这可能是一个问题,因为它可能具有大量的内存会话。
有没有更好的方法来存储这些变量?
例如,当用户登录时,我想存储有关该用户的数据并将其显示在需要的地方,而不必每次都查询数据库。
使用 cookie - 无论您的负载平衡环境如何,它们都可以工作
其他选项包括:
1)将您的会话值写入 sql 数据库-您可以配置您的 asp.net 应用程序以配置会话状态以使用 sql 服务器-但这有其自身的问题,因为会话永远不会超时(因此您需要通过代码显式处理此问题)
2)如果不使用 sql server - 基本上,当您有太多用户并且您在 Web 服务器上实现负载平衡时,您会遇到问题 - 因此用户可以在同一个会话中转到不同的 Web 服务器(它不会工作)
也有一个解决方法 - 它称为 STICKY SESSIONS - 您的 Web 服务器可以保证您的用户在会话中始终访问同一个 Web 服务器
3) 使用 .net 2.0 提供程序模型,您甚至可以通过实现他们的委托来编写自己的会话存储提供程序 - 因此您可以在您的 Web 服务器/共享服务器上创建自己的 xml 文件以在那里读取/写入会话数据:-)
所以有很多方法可以解决这个问题。然而,最简单且具有成本效益的解决方案是使用 cookie
会话是这里的方式,它们旨在跨请求保留有关当前会话的信息。ASP.NET 框架中没有其他对象具有此意图。
您可以使用缓存,或存储在应用程序集合中,但唯一标识单个会话数据的责任取决于您。
还取决于您处理会话何时终止,并释放存储在这些集合(缓存或应用程序)中的实例。
根据您可能“认为”会发生的事情开始提出这些问题确实是个坏主意。这是过早优化的一种形式,您应该避免它。相反,使用会话,因为它们是为此目的而设计的,然后测量瓶颈所在并解决它们,如果性能是测试时的问题。
您可能会使用缓存。它具有内置机制,可在内存耗尽时释放...
绝对为此使用cookie。最好的方法是让自己成为一个 cookie 包装类,它将为您完成所有繁重的工作 - 检查 cookie 是否为空,访问 httpcontext 等。无需将您的代码搞砸;只需将其全部抽象为 cookies.cs 或 .vb。
SetCookieValue(someValue, cookieName); //there will be some expiration concerns here as well
myValue = GetCookieValue(cookieName);
如果您认为您的数据对于 Session 来说太大了,我会考虑使用缓存的某种数据库,这样您就不会进行不必要的调用。
如果您要存储的是每用户会话数据,那么使用 ASP.NET 会话绝对是您的最佳选择。如果您最担心内存使用情况,那么您可以使用 MSSQL 模式。数据必须存在于某个地方,并且选择使用哪种会话模式取决于您的环境和用户的使用模式。
在您看到这样的问题并尝试解决之前,不要假设会话状态的大小会出现问题。例如,尽管整个应用程序可能使用大量会话状态,但任何给定用户在会话过程中可能不会使用那么多。
我也有可能从默认会话状态提供程序更改为 SQL 提供程序或状态服务器提供程序会缓解内存问题。
您可以使用缓存,但缓存是应用程序范围的。您需要使用用户 id 或会话 id: 来限定缓存条目Cache[userID + ".MyCacheEntry"]
。
在任何情况下都不要使用静态变量来存储这些数据。正如您的主题行所建议的,它们是应用程序范围的,而不是每个用户的。