【问题标题】:Application vs Session vs Cache应用程序 vs 会话 vs 缓存
【发布时间】:2011-02-23 20:15:18
【问题描述】:

以上所有内容的合适用例是什么?似乎会话和缓存非常相似,我想不出对应用程序有多大用处。

【问题讨论】:

标签: asp.net


【解决方案1】:

Application 和 Session State 有一个很重要的区别:

应用程序状态是一个可供 ASP.NET 应用程序中所有类使用的数据存储库。应用程序状态存储在服务器的内存中,比在数据库中存储和检索信息要快。 与特定于单个用户会话的会话状态不同,应用程序状态适用于所有用户和会话。因此,应用程序状态是存储少量常用数据的有用地方,这些数据不会从一个用户更改为另一个用户

Application State Overview
Session State Overview

另一方面,缓存允许您将需要大量服务器资源才能创建的对象存储在内存中 - 它提供了强大的功能,允许您自定义项目的缓存方式和缓存时间缓存 - 您可以设置广泛的属性,例如优先级和过期时间。

Caching Application Data Overview

虽然它们可能看起来很相似,但它们明显不同,并且在最广泛的 ASP.NET 应用程序中扮演着不同的角色。

【讨论】:

  • objects in memory that require extensive server resources to create 是什么意思?如果我必须存储一个字符串键值对(所有用户都可以访问),那么我会将它存储在 Application 状态,如果我必须存储一个常用文件的内容,那么我会将它存储在 Application缓存。这是一个公平的例子吗?如果所有内容都仅存储在应用程序的主内存中,那么除了具有过期等功能之外,为什么将其保存在缓存中会有任何好处。归根结底,应用程序状态和缓存都占用了应用程序的主内存。不是吗?
  • @RBT 虽然它们都使用服务器端内存,但缓存可能因多种因素而失效,例如优先级、时间或依赖项(例如缓存中的另一个项目或文件或目录)。我会阅读缓存应用程序数据概述答案中提供的链接,以更好地了解这些功能。
  • Cache和Session的存储有区别吗?或者它们被保存在工作进程内存中,除非没有明确实现。因为缓存有 MB 的限制。
  • System.Web.Caching.Cache 还具有广泛的自动过期和依赖特性。 HttpApplicationState 用于简单的名称值查找。
【解决方案2】:

会话是每个用户的。它不会在用户之间共享。

应用程序和缓存范围是应用程序范围的。缓存可能会过期。如果您有可以更改的数据,比如说 5 分钟,则可以将其放入缓存中,而如果您有不定期更新的数据,则可以将其放入应用程序变量中。

【讨论】:

  • 看来会话是您 95% 的时间会使用的东西。我猜缓存可以用于页面上使用查询的组件。我看不到应用程序状态的用处
  • 这取决于应用程序。如果您的内容收集和聚合页面视图非常耗时,那么将其缓存在您自己的服务器上是有意义的,这样每个用户都会获得相同的缓存内容。但是,特定于用户经历的过程的事情通常放在 Session 中。 ApplicationState 可用于配置或访问外部服务的令牌。
  • 应用程序对象的最大用途是限制同一​​用户的多会话。每当用户登录时,在应用程序中输入并在 Session_ends 时将其删除。现在,当应用程序已经持有用户 ID 的条目时,这意味着一个活动会话已经在进行中
【解决方案3】:

会话用于用户特定信息。通常,您会保存用户名、用户偏好,如屏幕名称、购物车 ID(如果您正在销售任何东西)、电子邮件等

当您拥有在所有人之间共享的信息时,通常会使用缓存。通常是为了减少对数据库的长进程或命中。 IE要显示前n篇文章。您可以为此设置时间限制,因此它会在一段时间后刷新日期

应用程序变量适用于您要保存在服务器上的静态信息。这可能是媒体文件所在的位置。

【讨论】:

    【解决方案4】:

    这些答案都没有足够清楚地说明缓存的一个非常重要的属性 - 它具有应用程序范围并且被所有用户共享!您存储在缓存中的任何数据都可供所有用户使用。您仍然可以在缓存中存储您希望仅供特定用户使用的数据,但您必须使用该用户唯一的缓存键值,例如Cache.Add("UserData" + userID, data...

    【讨论】:

    • 这是一个非常重要的区别,在这类问题中没有过多强调。
    【解决方案5】:

    内置的 inproc 会话对象有一个非常重要的限制,其他答案都没有指出,这限制了它在高并发网站中的使用。具体来说,如果您更改代码中的任何会话项,请求将停止并等待,直到对会话对象的所有读取请求都完成。在这种情况下,缓存是更好的选择:

    I just discovered why all ASP.Net websites are slow, and I am trying to work out what to do about it

    【讨论】:

      【解决方案6】:

      关于会话与缓存的另一件事。如果在更改依赖对象时需要使会话中存储的数据无效或重新加载,则可能很难做到这一点。它们的缓存可能是更好的选择。

      【讨论】:

        猜你喜欢
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 2010-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-20
        相关资源
        最近更新 更多