关于asp.net:Application vs Session vs Cache

Application vs Session vs Cache

对于上述所有内容,什么是合适的用例?看起来会话和缓存非常相似,我想不出在应用程序中有什么用处。


应用程序和会话状态有非常重要的区别:

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

应用程序状态概述
会话状态概述

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

缓存应用程序数据概述

尽管它们看起来很相似,但它们是明显分开的,在最广泛的意义上,它们在ASP.NET应用程序中扮演不同的角色。


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

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


会话用于特定于用户的信息。通常,您会保存用户名、用户首选项,如屏幕名称、购物车ID(如果您出售任何商品)、电子邮件等。

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

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


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


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

我刚刚发现了为什么所有的ASP.NET网站都很慢,我正在努力解决这个问题。