缓存与会话的优势

Posted

技术标签:

【中文标题】缓存与会话的优势【英文标题】:Advantages of Cache vs Session 【发布时间】:2010-09-30 12:40:41 【问题描述】:

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

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

【问题讨论】:

您将缓存您希望所有用户在应用程序上使用的数据。历史上可能不会改变的数据。 Session 应该用于存储用户上下文的数据,例如过滤缓存数据的结果。 HttpContext.Current.Cache vs HttpRuntime.Cache ? @Kiquenet 我真的很佩服你的努力。 @Kiquenet 那么,让我告诉你我对它的理解。 HttpContext 是关于当前请求的。它仅在请求生命周期内是活动的。但是 HttpRuntime 始终保持活力。因此,只要您分配给它的过期持续时间,您的缓存就处于活动状态。我不确定,但这是我在测试时看到的。 【参考方案1】:

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

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

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

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

【讨论】:

其实缓存可以用 Velocity 存储在外部 可以实现将值存储在外部的缓存,但 .Net 框架默认不支持外部缓存。但是对于会话,支持外部会话。 另一个需要注意的是,IIS 将在每​​个请求与缓存的情况下对整个会话进行水合。缓存可以更加精细。 请检查其他参数!其中哪一个最安全?其中哪个尺寸最大?哪一个是没有错误的?【参考方案2】:

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.再次测量...

【讨论】:

仅当您将缓存键设置为特定于该 sessionID 时 HttpContext.Current.Cache vs HttpRuntime.Cache ? HttpContext.Current.Cache 是每个用户 ? 你说测量更多,更多,再次。如何更好地衡量模式和实践?有样品吗?【参考方案3】:

另一个重要区别,Session State 将被阻塞如果并发异步 Ajax 请求被执行,它会影响性能

【讨论】:

【参考方案4】:

缓存属于Application范围,目的是减少获取一条数据的次数。会话位于用户的会话范围内,目的是提供特定的用户状态。

【讨论】:

【参考方案5】:

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

根据为您设置的方式,当您使用数据表之类的东西时,可能会影响性能,告诉我您可能正在存储大量数据。

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

【讨论】:

【参考方案6】:

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

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

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

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

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

【讨论】:

会话也不保证。 HttpContext.Current.Cache vs HttpRuntime.Cache 区别 ? HttpContext.Current.Cache 是每个用户 ?【参考方案7】:

见this answer。

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

【讨论】:

【参考方案8】:

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

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

您在会话存储中有多个选项。 SQL Server 也可以用作会话状态的存储。 azure 上提供了自定义会话技术,例如表存储提供程序等。

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

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

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

【讨论】:

以上是关于缓存与会话的优势的主要内容,如果未能解决你的问题,请参考以下文章

身份验证:JWT 使用与会话

CDN概念和思路基本原理优势及应用领域和常见的缓存策略

使用 CDN的优势

Redis与高级语言内置的数据结构相比的异同及优势

使用 SDWebImage 而不是 AFNetworking 进行图像加载有很大的优势吗?

局部性原理与磁盘预读角度解析B树的优势