ASP.Net中的数据缓存与会话对象

是否应将站点的动态业务对象存储在用户会话中或使用ASP.Net缓存(订单,配置文件信息等对象)?

我曾经使用会话来存储业务对象的网站,但我想知道……缓存有哪些优点或缺点?

如果对象在用户会话之间可共享,则使用缓存。 如果对象对每个会话都是唯一的 – 可能是因为它们受权限控制 – 然后将其存储在会话中。 进程内会话本身存储在缓存中,因此决定因素确实应该是数据的范围。

缓存只是 – 缓存。 您永远不能依赖于那里的条目,因此不必在这方面做出任何假设:准备直接进入DB(或其他任何地方)来重新获取数据。

另一方面,会话更适合存储对象,但我个人试图避免使用会话存储来支持数据库。 我通常通过抽象不透明的ISessionStoreService接口后面的存储来做到这一点:

interface ISessionStore { T GetEntry(string key); void SaveEntry(string key, T entry); } 

然后“dependency injection”适当的实现,无论是InmemorySessionStoreDbSessionStore还是其他什么。

ASP.NET系统缓存对应用程序是全局的,因为会话对于当前用户是唯一的。 如果您选择使用全局缓存来存储对象,则需要创建对象标识策略,以便为每个用户获取正确的对象。

如果您希望提高性能,最好用分布式内存缓存(如Microsoft的速度)替换ASP.NET会话状态。 Microsoft发布了有关如何将会话使用替换为目标Velocity的文章。 您也可以以相关方式使用Memcache或其他类似产品。

会话对象适用于仅用户数据,另一方面,Cache对象更适合于为应用程序共享的数据。
保存在一个或另一个中的关键是确定您要存储的内容是仅用户数据还是需要在所有应用程序中共享。

Session =>具有分步界面的网页(例如在线测试)。
缓存=>在某种天气小部件中显示的信息(如谷歌在其igoogle.com页面中显示的那个)。
希望这可以帮助。

虽然您可以将业务对象存储在Cache中,但Cache旨在提高性能而不是状态管理。 想象一下,你有一个从数据库中获取1000条记录的过程(大约需要3秒),你需要它几分钟。 您可以将对象存储在Cache中并设置过期日期,优先级和依赖关系(如SqlDependency或FileDependency),因此对于下一个请求,您可以使用缓存数据而不是从数据库中重新获取。 您可以将对象存储在Session中,但默认情况下不能为Session设置依赖关系。 此外,Cache具有一种独特的行为,当系统需要内存时,它将根据其优先级从缓存中释放对象。 缓存对象对应用程序是全局的,并在所有用户之间共享,但Session不共享,并且可用于每个用户(会话)。