在Session和Cache中存储数据表有什么区别?有哪些优点和缺点?
因此,如果它是一个简单的搜索页面,它返回数据表中的结果并将其绑定到gridview.如果用户'a'搜索并且用户'b'搜索,是否最好将其存储在Session中,因为每个用户很可能会有不同的结果,或者我仍然可以将他们的每个搜索存储在缓存中,或者这是否有意义,因为有只有一个缓存.我想基本上我想说的是Cache会被覆盖.
一个重要的区别是,缓存中的项目可能会在指定的时间后过期(将从缓存中删除).放入会话的项目将保留在那里,直到会话结束.
当可用内存量变小时,ASP.NET还可以从缓存中删除项目.
另一个区别是:会话状态可以保持在外部(状态服务器,SQL服务器)并在Web应用程序的多个实例之间共享(用于负载平衡).缓存不是这种情况.
除了这些差异(正如其他人已经注意到的):会话是按用户/会话,而缓存是每个应用程序.
AFAIK,关键区别在于会话是针对每个用户的,而缓存将针对应用程序范围的项目.
如其他答案中所述,您可以在缓存中存储每个用户信息,前提是您提供密钥(通过会话或cookie).然后,您将拥有更多控制权来使缓存中的项目失效,并设置对它们的依赖关系.因此,如果有问题的DataTable会定期更改,那么缓存可能是一个合适的选择.否则,如果是静态会话可能更合适.史蒂芬史密斯有一个关于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.再次测量......
另一个重要的区别是,如果执行并发的异步Ajax请求,将阻止会话状态,这将影响性能
缓存位于应用程序范围内,目的是减少获取数据的次数.会话位于用户的会话范围内,目的是提供特定的用户状态.
那么它取决于你如何为ASP.NET配置会话.您是将会话存储在数据库还是内存中?如果在内存中您使用的是单独的服务器,或者您正在使用当前的Web服务器进行会话?
根据为您设置的方式,当您使用类似数据表的内容时,可能会对性能产生影响,这会告诉您可能正在存储大量数据.
会话也按用户存储,并且每个用户通过会话票据检索,如果他们不接受cookie并且您已将ASP.NET设置为无cookie模式,则会话票据存储在会话cookie或URL中.您缓存的任何内容都将在应用程序级别进行缓存,并且可供所有用户会话使用,这些会话可能是您想要的,也可能不是.