我正在尝试为我的 Web 应用程序创建数据访问层。目前,所有数据表都存储在 session 中。当我完成时,DAL 将填充并返回数据表。将返回的数据表存储在 session 中是个好主意吗?分布式/共享缓存?或者每次只是 ping 数据库?注意:通常数据表中的行数会很小<2000。
其他信息:
几乎没有数据被共享。发送到 SQL 查询的参数由用户选择。用户可用的参数值取决于用户是谁。在大多数情况下,两个用户不可能运行相同的 sql 查询。但是,同一用户可以多次运行相同的查询。
更多信息: 并发用户数~50,000
重要信息: 在 99% 的情况下,没有两个用户会拥有相同的数据/查询,但是,同一用户可能多次运行相同的查询/获取相同的数据。
谢谢
最佳答案
在 session 中存储数据不是一个好主意,因为:
- 每个用户都会获得相同数据的单独副本 - 极大地浪费服务器内存。
- 如果您在 session 中填充了太多数据,IIS 将回收该 session 。
我建议将数据表存储在 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;
}
编辑: - 问题更新
缓存与本地 session - 本地 session 状态是全有或全无。如果它太满,IIS 将回收其中的所有内容。相比之下,当内存太低时,缓存项会被单独删除,因此问题要小得多。
缓存与 session 状态服务器 - 我没有任何数据来支持这一点,所以如果我弄错了,请说出来,但我会认为在每个物理服务器 AppDomain 的内存中独立缓存数据比将其存储在共享 session 状态服务中可以更好地扩展。
关于c# - DAL、 session 、缓存架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2684918/