c# - DAL、 session 、缓存架构

标签 c# asp.net architecture data-access-layer

我正在尝试为我的 Web 应用程序创建数据访问层。目前,所有数据表都存储在 session 中。当我完成时,DAL 将填充并返回数据表。将返回的数据表存储在 session 中是个好主意吗?分布式/共享缓存?或者每次只是 ping 数据库?注意:通常数据表中的行数会很小<2000。

其他信息:

几乎没有数据被共享。发送到 SQL 查询的参数由用户选择。用户可用的参数值取决于用户是谁。在大多数情况下,两个用户不可能运行相同的 sql 查询。但是,同一用户可以多次运行相同的查询。

更多信息: 并发用户数~50,000

重要信息: 在 99% 的情况下,没有两个用户会拥有相同的数据/查询,但是,同一用户可能多次运行相同的查询/获取相同的数据。

谢谢

最佳答案

在 session 中存储数据不是一个好主意,因为:

  1. 每个用户都会获得相同数据的单独副本 - 极大地浪费服务器内存。
  2. 如果您在 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/

相关文章:

firebase - 更改 firebase 数据模型(同时生产多个应用程序版本)

c# - 获取进程的所有窗口句柄

c# - 异步死锁?

c# - 返回选定的指定列

C++(嵌套)函数调用指令——寄存器

c# - 收集流程中的错误并将它们发送回调用者 - 最佳方法?

c# - Windows 10 UWP - 如果前台应用程序正在运行,则停止后台任务

c# - radiobuttonlist 奇怪的 View

asp.net - Entity Framework 核心 : issue with Contains method

css - 将 Z-Index 应用于 DropDownTree 不会影响它