Asp.net 在会话中缓存数据库数据-获得正确的平衡

Asp.net 在会话中缓存数据库数据-获得正确的平衡,asp.net,performance,optimization,session,caching,Asp.net,Performance,Optimization,Session,Caching,如果在ASP.NET会话中缓存数据库中的数据,则会加快对该数据的后续请求(注意:取决于相关数据的序列化/反序列化成本),代价是IIS中的内存负载 (好的,这可能是对现实情况的简化——请随意更正或完善我上面的陈述) 您是否使用任何规则(简单的经验规则或其他规则)来决定何时适合在会话中缓存 更新 使用Session存储只读数据而没有经过深思熟虑的基本原理,是否可以简单地视为另一种情况?(因此,糟糕)切记会话中的缓存如果使用InProc模式,则会限制可伸缩性,除非会话为空时代码返回数据库。您将被迫使用

如果在ASP.NET会话中缓存数据库中的数据,则会加快对该数据的后续请求(注意:取决于相关数据的序列化/反序列化成本),代价是IIS中的内存负载

(好的,这可能是对现实情况的简化——请随意更正或完善我上面的陈述)

您是否使用任何规则(简单的经验规则或其他规则)来决定何时适合在会话中缓存

更新
使用Session存储只读数据而没有经过深思熟虑的基本原理,是否可以简单地视为另一种情况?(因此,糟糕)

切记会话中的缓存如果使用InProc模式,则会限制可伸缩性,除非会话为空时代码返回数据库。您将被迫使用单个服务器或将用户锁定到特定服务器

如果您使用的会话状态服务器不适用,并且如果您使用SQL存储会话状态,那么使用会话进行缓存是毫无意义的

编辑 有关此主题的任何建议都取决于您的具体环境。正如您所说的,即使在使用sql会话状态时,一个非常复杂的sql查询也可能受益于缓存。我认为最重要的是首先让您的应用程序执行功能并实现业务需求。然后返回并测试和优化应用程序,以处理您期望的负载

编辑2 根据你的最新消息,不,我不认为这是真的。在我的一个ASP.Net应用程序中,我使用会话状态来存储一个复杂的对象模型,然后用户对该模型进行操作和修改。我们使用的是AJAX,所以当用户更新对象时,我们与服务器有很多短时间的通信。将对象保持在会话状态是为了方便起见。该对象执行大量定制计算以生成不同的数据点,因此在服务器上这样做是理想的,而不是试图在servr和javascript中复制代码。同时,保持会话状态可以让我们很容易地实现撤销功能

是的,我知道我们牺牲了可伸缩性,但我欢迎有一天我和老板坐下来解释我们有问题,因为我们有太多的用户(我知道他也会)

因此,我认为问题是,为什么要在会话中存储数据?这是为了方便起见,还是为了在用户登录时提供对瞬态数据的访问?这与将其存储在那里进行缓存不同。使用缓存时需要记住的一件事是如何刷新缓存?你如何使它无效?我不知道会话状态是用来处理这个问题的

编辑3
回到它,良好的只读数据,用户特定的,从数据库加载昂贵的,继续在会话中缓存它。您可以编写代码,这样如果它不在会话中,您就可以点击数据库。有一个很好的小助手类可以做到这一点,它隐藏在你的web应用程序中,你甚至可以使用会话,你应该是好的。如果你发现你遇到了问题,你只有一个地方可以更改它,那么把它藏在你的网站上是一件好事。

鉴于很难保证会话中的数据在合理的时间范围内被清除,我会非常小心地兑现那些超出奇数整数的东西。当你达到一个大范围时,你要么会遇到内存问题,要么会让你所有的用户都出现会话超时错误。请记住,与缓存对象会话不同,当内存不足时,不会终止对象会话


另外,正如Josh所说,如果您转到多个服务器,并且需要使用数据库或会话状态服务器,那么您的会话对象将需要是可序列化的。在这种情况下,序列化和反序列化的成本可能比优化良好的查询的成本更高。

Josh的两个优点。但是,如果我使用SQL存储会话状态,并且我的初始SQL查询复杂且耗时,那么我认为在会话中缓存结果仍然有好处。在我的更新中添加了“for read-only data”条件,询问过早优化,作为对编辑2的回应,与查询成本相比,序列化/反序列化成本更高。如果是SQL会话,则序列化成本加上查询成本。