【问题标题】:ASP.net application session cache best practices and patternsASP.net 应用程序会话缓存最佳实践和模式
【发布时间】:2011-03-29 12:06:37
【问题描述】:
在 asp.net 中,主要的数据存储是应用程序、会话,我们还有对象缓存。
我使用了常识提示/技巧(例如,永远不要将用户特定数据放入应用程序中,永远不要将非托管资源放入会话中等),但老实说,我从未遇到过关于何时使用 MSDN 或来自像 Haack 和 Gu 这样的著名人物,它们涵盖了这三个方面(例如,Google 第一次访问 MSDN 时谈到了将应用程序用作全局缓存,如果是这样,对象缓存有什么用?
另外,我发现很少讨论的是场景比较,例如,我知道过度使用会话很容易不必要地加载内存使用,但是如果你使用对象缓存作为存储相同数据的替代方案会发生什么?
编辑:这是迄今为止我找到的最好的信息:http://msdn.microsoft.com/en-us/library/ff647787.aspx
【问题讨论】:
标签:
asp.net
session
caching
【解决方案1】:
使用 Session 存储特定于用户的信息,因为框架会自动将每个会话存储与特定用户相关联。
将对象缓存用于可以缓存一次并在整个应用程序或一组用户之间重复使用的信息。如果您将特定于用户的数据存储在对象缓存中,那么您将不得不发明一些机制来关联缓存条目。这不仅需要代表您进行额外的工作,而且您这样做的方式可能会增加恶意用户以某种方式进行类似于会话欺骗的事情的可能性。
我不知道您何时需要使用 Application 对象。如果我没记错的话,Application 对象更像是经典 ASP 的遗物。
另一种同样重要的缓存形式是通过 HttpContext.Items 集合按请求进行缓存。这允许您在请求的生命周期内缓存数据,如果您在单个请求期间(例如来自页面上的不同用户控件)不断请求相同的数据,这将非常有用。有关此方法的更多信息,请参阅HttpContext.Items - a Per-Request Cache Store。
【解决方案2】:
我建议至少为会话创建一个包装类,如果它们在您的代码中被使用的话。这样,您可以注入该类的实例来完成实际工作,并使用模拟版本进行单元测试。我为一个会话被广泛使用的大型项目执行此操作,并且效果相当好。
您可以将其与外观模式结合使用 - 包装器将提供您需要的特定方法,而不是公开通用接口。例如,会话接受对象并返回对象,它不是强类型的。包装器可以有强类型的 add 和 get 方法。