缓存与会话的优势


68

在会话和缓存中存储数据表有什么区别?优点和缺点是什么?

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


您将缓存希望所有用户在应用程序上使用的数据。历史上可能不会更改的数据。会话应用于存储用户上下文的数据,例如,如果它像过滤缓存数据的结果那样。
Piotr Kula 2015年

3
HttpContext.Current.Cache vs HttpRuntime.Cache
Kiquenet

1
@Kiquenet我的确很佩服您的努力。
ozgur '16

@Kiquenet然后,让我告诉您我的理解。HttpContext与当前请求有关。它仅在请求生存期内有效。但是HttpRuntime始终保持活动状态。因此,只要分配给它的到期时间长短,您的缓存就会保持活动状态。我不确定,但这是我测试时看到的。
ozgur's

Answers:


83

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

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

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

除了这些差异(如其他人所述)之外:会话是每个用户/会话,而缓存是每个应用程序。


7
实际上,缓存可以通过Velocity外部存储
-Webjedi

3
可以实现在外部存储值的缓存,但是.Net框架默认不支持外部缓存。但是,对于会话,支持外部会话。
Kibbee

另一个需要注意的是,IIS会充实每个会话的整个Session,而Cache则更为精细。
罗恩

1
请检查其他参数!其中哪一个最安全?其中哪个尺寸最大?他们中的哪一个没有错误?
阿里·拉索里

29

AFAIK,主要区别是会话是每个用户,而缓存将用于应用程序范围的项目。

如其他答案所述,您可以将每个用户的信息存储在缓存中,只要您提供密钥(通过会话或cookie)即可。然后,您将有更多控制权来使缓存中的项目过期,并对其设置依赖关系。因此,如果所讨论的DataTable会定期更改,则缓存可能是一个适当的选择。否则,如果是静态会话,则可能更合适。史蒂文·史密斯(Steven Smith)有一个关于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.再次测量...


3
仅当您为该sessionID设置特定的缓存密钥时
StingyJack

2
HttpContext.Current.Cache与HttpRuntime.Cache?HttpContext.Current.Cache是每个用户的吗?
Kiquenet

您说再测量一次。如何衡量更好的模式和实践?有样品吗?
PreguntonCojoneroCabrón

15

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


5

缓存属于“应用程序”范围,其目的是减少获取一条数据的次数。会话处于用户的会话范围内,目的是赋予特定的用户状态。


5

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

当您使用诸如数据表之类的数据表时,这可能会告诉您可能正在存储大量数据,具体取决于性能如何设置。

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


4

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

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

因此,基本上,永远不会保证Cache中的项目存在,但Session会保留在那里直到会话结束。

基于每个用户(通过Session或创造性地使用Cache)存储项目可能会导致大量内存使用,因此应谨慎考虑。

最重要的是,如果IIS重置工作进程,则可能会丢失缓存和会话。


1
会话也不保证。
StingyJack

2
HttpContext.Current.Cache与HttpRuntime.Cache的 区别?HttpContext.Current.Cache是每个用户的吗?
Kiquenet

4

看到这个答案

会话可能会破坏您的应用性能,除非您使用诸如memcached或Velocity之类的后端提供程序。通常,您应该避免使用它。


0

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

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.