DAL、会话、缓存架构
Posted
技术标签:
【中文标题】DAL、会话、缓存架构【英文标题】:DAL, Session, Cache architecture 【发布时间】:2011-02-10 17:04:50 【问题描述】:我正在尝试为我的 Web 应用程序创建数据访问层。目前,所有数据表都存储在会话中。当我完成后,DAL 将填充并返回数据表。将返回的数据表存储在会话中是个好主意吗?分布式/共享缓存?还是每次都ping数据库?注意:一般数据表中的行数会很小
附加信息:
几乎没有任何数据是共享的。发送到 SQL 查询的参数由用户选择。用户可用的参数值取决于用户是谁。在大多数情况下,两个用户不可能运行相同的 sql 查询。但是,同一个用户可以多次运行同一个查询。
更多信息: 并发用户数 ~50,000
重要信息: 在 99% 的情况下,不会有两个用户拥有相同的数据/查询,但是,同一用户可能会多次运行相同的查询/获取相同的数据。
谢谢
【问题讨论】:
【参考方案1】:在Session
中存储大量数据是一个非常糟糕的主意。每个用户都会得到自己的版本!
如果这是共享数据(所有用户都相同),请考虑将其移至Application
对象。
【讨论】:
几乎没有数据是共享的。发送到 SQL 查询的参数由用户选择。用户可用的参数值取决于用户是谁。在大多数情况下,两个用户不可能运行相同的 sql 查询。但是,如果同一个用户多次运行同一个 sql,那么避免这种情况不是很有意义吗? 您将拥有多少用户?如果并发用户不多,让 SQL 管理并发问题。当您需要时进行优化,而不是之前。 至少 50,000 个并发用户 查询的重复频率如何?如果只有几次,你还不如让 SQL 来处理。 未知。这取决于用户。我会打赌不止一对【参考方案2】:在会话中存储数据不是一个好主意,因为:
-
每个用户都会获得相同数据的单独副本 - 极大浪费了服务器内存。
如果您用太多数据填充会话,IIS 将回收会话。
我建议将数据表存储在Cache 中,并且仅在第一次请求时才填充每个表,而不是一次全部填充。这样,如果 IIS 开始回收缓存中的空间,您的代码将不会受到影响。
非常简单的按需获取示例:
T GetCached<T>(string cacheKey, Func<T> getDirect)
object value = HttpContext.Current.Cache.Item(cacheKey);
if(value == null)
value = getDirect();
HttpContext.Current.Cache.Insert(cacheKey, value);
return (T) value;
编辑: - 问题更新
缓存与本地会话 - 本地会话状态是全有或全无。如果它太满,IIS 将回收其中的所有内容。相比之下,当内存太低时,缓存项会单独删除,因此问题要小得多。
缓存与会话状态服务器 - 我没有任何数据可以备份,所以如果我有这个错误请说出来,但我会认为在每个物理服务器 AppDomain 的内存中独立缓存数据将比将其存储在共享会话状态服务中更好地扩展。
【讨论】:
1.几乎没有用户会得到相同的数据 2. HttpCache 不能与多个服务器一起工作。但是,当与 Velocity 或类似的东西一起使用时,这个概念似乎是个好主意 缓存大小意味着相对较小,我认为缓存中有多个数据表的 50,000 个用户是不可行的。 @Joe:是的。我想最好的办法是不要从任何地方开始缓存任何数据,然后分析应用程序以查看哪些表将从缓存中受益最多。 好吧,同一个用户可以多次运行同一个查询。即他们运行查询,切换到不同的页面/选项卡运行查询,然后切换回来并运行相同的查询。【参考方案3】:在Application
或Cache
对象中存储查找/字典 - 以及您的应用非常频繁需要的项目;查询数据库以获取取决于用户角色的数据。
--编辑--
这是对您的评论的回应。
通常在任何面向数据的系统中,查询围绕事实表(或不可避免的查询表)运行;假设您确实有一组 不可避免的表格,那么您可以使用Cache.Insert()
:
-
在应用启动时加载不可避免的表;
根据表请求将大多数查询的表加载到缓存中;
查询数据库中查询最少的表。
如果您没有任何性能问题,那么让 SQL 处理一切。
【讨论】:
缓存会不会有太多数据无法处理? @subtl3:嗯,这实际上取决于您拥有的数据量。考虑到Note: generally the number of rows in the datatable will be small < 2000
和你的性能限制......我相信Cache
是你最好的选择;即使您考虑使用 Application
对象,它也不支持过期功能,这在您的情况下是必须的。【参考方案4】:
我要说的第一件事是:缓存并非无处不在。您应该在与数据访问相关的瓶颈问题上明智且非常特别地使用它。
我认为在任何地方存储 1000 个不同的数据表和 2000 条记录并不是一个好主意。如果查询是如此动态,以至于在短时间内具有相同的查询是例外,那么缓存似乎不是一个好的选择。
关于分布式缓存选项,我建议您检查 http://memcached.org 。全球许多大型项目使用的分布式缓存。
我知道 Velocity 就在附近,但到目前为止我知道它需要 Windows Server 2008,而且它还是非常新的东西。通常,Microsoft 产品从 2.0 版开始就很好 :-)
【讨论】:
我在看 SharedCache。 Memcached 看起来非常不像.NET 有一个.NET客户端sourceforge.net/projects/memcacheddotnet。它可以完美地从 .NET 中使用:-) AppFabric/Velocity 将于 6 月底发布。以上是关于DAL、会话、缓存架构的主要内容,如果未能解决你的问题,请参考以下文章