缓存与会话的优点

时间:2009-01-09 16:06:12

标签: c# asp.net session caching viewstate

在Session和Cache中存储数据表有什么区别?有哪些优点和缺点?

因此,如果它是一个简单的搜索页面,它返回数据表中的结果并将其绑定到gridview。如果用户'a'搜索并且用户'b'搜索,是否最好将其存储在Session中,因为每个用户很可能会有不同的结果,或者我仍然可以将他们的每个搜索存储在缓存中,或者这是否有意义,因为有只有一个缓存。我想基本上我想说的是Cache会被覆盖。

8 个答案:

答案 0 :(得分:82)

一个重要的区别是,缓存中的项目可能会在指定的时间后过期(将从缓存中删除)。放入会话的项目将保留在那里,直到会话结束。

当可用内存量变小时,ASP.NET也可以从缓存中删除项目。

另一个区别:会话状态可以保持在外部(状态服务器,SQL服务器)并在Web应用程序的多个实例之间共享(用于负载平衡)。缓存不是这种情况。

除了这些差异(正如其他人所说):会话是按用户/会话进行的,而缓存是按应用程序进行的。

答案 1 :(得分:28)

AFAIK,关键区别在于会话是针对每个用户的,而缓存将针对应用范围内的项目。

如其他答案中所述,您可以在缓存中存储每个用户信息,前提是您提供密钥(通过会话或cookie)。然后,您将拥有更多控制权来使缓存中的项目失效,并设置对它们的依赖关系。因此,如果有问题的DataTable会定期更改,那么缓存可能是一个合适的选择。否则,如果是静态会话可能更合适。 Steven Smith has an excellent video on caching at dnrtv值得一试。

这取决于你想要达到的目标,你有多少时间。关于如何在应用程序中存储状态,还有一些其他选择需要考虑。 根据表的大小,您可以考虑将状态存储在cookie中(如果是敏感信息则加密)。或者,如果它是应用程序作用域数据,则冷使用页面或类上的静态字段。还有Application对象。

更新:我认为您必须问自己的关键问题是谁应该看到这些数据。

Are they going to access the data frequently?  

(不,不要打扰)。

Is it going to change?  

(不,使用静态字段或应用程序)。

Is it acceptable for user a and user b to see the same results?  

(不,使用包含用户名和搜索词的密钥的缓存。) (是的,使用搜索词的键来使用缓存)。

老实说,如果你在开发过程中不远,我会考虑将缓存/状态问题暂时停放 - 你甚至可能都不需要它。

性能调优的前三个规则是: 1.测量,2。测量更多。 3.再次测量......

答案 2 :(得分:11)

另一个重要区别是,会话状态将被阻止如果执行并发异步Ajax请求,则会影响性能

答案 3 :(得分:5)

缓存位于应用程序范围内,目的是减少获取数据的次数。会话位于用户的会话范围内,目的是为特定的用户提供状态。

答案 4 :(得分:5)

这取决于您如何为ASP.NET配置会话。您是将会话存储在数据库还是内存中?如果你在内存中使用的是单独的服务器,或者你正在使用当前的网络服务器进行会话?

根据您的设置方式,当您使用类似数据表的内容时,可能会对性能产生影响,这会告诉您可能存储了大量数据。

此外,每个用户都存储会话,并且每个用户通过会话票证检索会话,如果他们不接受cookie并且您已将ASP.NET设置为无cookie模式,则会话票证存储在会话cookie或URL中。您缓存的任何内容都将在应用程序级别进行缓存,并且可供所有用户会话使用,这些会话可能是您想要的,也可能不是。

答案 5 :(得分:4)

会话是每个用户,缓存是针对应用程序。

缓存中的项目可以并将根据IIS工作进程的到期时间(滑动或固定)和内存限制自动删除。

所以基本上,Cache中的项目永远不会保证存在,但会话将一直存在,直到会话结束。

以每个用户为基础存储项目(通过会话或创建使用缓存)可能导致大量内存使用,应该仔细考虑。

除此之外,如果IIS重置了工作进程,您可能会丢失缓存和会话。

答案 6 :(得分:2)

this answer

会话可以扼杀您的应用程序性能,除非您使用某些后端提供程序,如memcached或velocity。一般来说你应该避免它。

答案 7 :(得分:0)

据我所知,这完全取决于您的需求。

无论何时需要维护用户状态,都必须在使用会话时非常小心。默认设置为“ InProc”,它使用单个服务器的内存,在基于云的应用程序中不能很好地工作。这可能适用于在多实例Web场环境中托管应用程序的您。 Windows Azure负载平衡器在连接的节点内使用循环分配。

会话存储中有多个选项。 SQL Server也可以用作会话状态的存储。自定义会话技术可在诸如表存储提供者之类的Azure上使用。

高速缓存也存储在服务器的内存中,但是与用户无关。同一池中的任何用户都可以访问应用程序缓存数据。简而言之,在云上,我们需要使用云提供商提供的缓存服务。 Azure提供Windows Azure分布式缓存服务。

事实上,当在应用程序中应用状态管理技术时,开发人员并不关心状态管理技术的影响。它

“如果您的客户端没有云支持,那么您不必担心云方案”