1

几天来,我一直在为我的 Web 应用程序阅读有关 ASP.NET 中状态管理的文章。在这个应用程序中,一个用户可以创建/保存/执行查询,我需要在用户保存查询之前保留查询的每个参数。
这些参数是字符串值,但一个用户的全局大小可能超过几兆字节。我们计划让我们的网站同时运行约 100 个用户。

在这些情况下,我认为将这些值存储在带有进程内模式的会话中并不好。

我们已经使用缓存机制和 AutoSave=true 实现了 ProfileProvider:SqlProfileProvider。

最好的解决方案是什么:将这些值存储在配置文件或会话中,但存储在 SQL 数据库中?

4

4 回答 4

1

取决于您的服务器内存以及您对它的关注程度。数据库总是适合这种类型的事情,因为您有更好的并发性和更稳定的方法来存储数据。

我的建议是对缓存的数据使用滑动过期时间,比如 10-20 分钟左右。这样,您将不会消耗太多服务器资源,因为随着用户变得不活跃,他们的会话数据将被驱逐。

有关如何进行滑动过期缓存的示例(也参考此处),您可以这样做:

public static void AddToCache(string key, Object value, int slidingMinutesToExpire)
{
        if (slidingMinutesToExpire == 0)
        {
            HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.NotRemovable, null);
        }
        else
        {
            HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(slidingMinutesToExpire), System.Web.Caching.CacheItemPriority.NotRemovable, null);
        }
    }
于 2009-11-17T21:28:33.087 回答
1

1)可以将会话保持为 Out Of Proc(在 SQL Server 上),因此问题更多是关于将它们保存在哪里:在内存中还是在数据库中。如果您保留在内存中,那么它将最终自动销毁。如果您保留在数据库中,那么您可以跨会话使用此数据。决定您是否需要跨会话保存这些参数(用户可以切换计算机;用户可以偶尔打开您的应用程序)- 他是否需要为他保留这些参数?

2)考虑优化 - 每个用户几兆字节的参数?!?如果这意味着用户可以有数百个查询并且它们应该在用户下次登录系统时可用,那么将所有这些都保存在数据库中。

于 2009-11-17T21:33:24.593 回答
1

我们已经取得了一定程度的成功,将用户详细信息保存到磁盘以防止其超出内存。当您想要特定的东西时,您必须将其读回内存,这可能会有点慢,但它确实有效。

例如,您可以序列化一些对象并将它们写入 Web 服务器硬盘上的文件。根据会话 ID、用户名等命名文件,然后您可以在需要时读取/写入文件。

于 2009-11-17T21:34:34.967 回答
1

最佳解决方案取决于您是否计划超越单台服务器。在负载平衡配置中,InProc 会话状态将无法正常工作(不使用粘性会话,这会带来其他问题)。Out of proc 会话状态,例如 State Server 或 SQL Server,要求您的状态信息为每个页面访问进行序列化和反序列化。每个用户有多个 MB,这可能会非常慢。

正如 Dave 所建议的,缓存是另一种选择。一个问题可能是缓存是否需要从一台 Web 服务器到另一台服务器保持同步。

The usual approach to this kind of problem is to store the data in the DB and in Cache, and to only retrieve it for those pages where it's really needed (unlike Session, which is read for every page). Then use SqlDependency or SqlCacheDependency to cache the data in a way that it can be updated on multiple servers if the DB changes.

于 2009-11-18T03:39:14.293 回答