ASP.Net中的数据缓存与会话对象有何区别?

11

网站中的动态业务对象,如订单、个人资料等,应该存储在用户会话中还是使用ASP.Net缓存?

我曾经使用过将业务对象存储在会话中的网站,但我想知道...使用缓存有什么优点或缺点?

5个回答

24

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


4
另一个需要考虑的因素是缓存数据的生命周期所需的控制级别和细度。会话限制您使用基于全局会话状态超时期限的滑动过期策略。直接使用缓存可以为这些参数提供额外的控制。 - James H

7

缓存就是缓存。你永远不能依赖条目存在,所以在这方面不应该做出任何假设:要准备好直接到数据库(或其他地方)重新获取数据。

另一方面,会话更适合存储对象,尽管我个人倾向于避免使用会话存储而选择使用数据库。我通常通过在不透明的ISessionStoreService接口后面抽象存储来实现这一点:

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

然后“依赖注入”适当的实现,可以是InmemorySessionStoreDbSessionStore或其他。


点赞!非常好的建议!你有C#中ISessionStore的内存实现示例吗? - ANewGuyInTown

2
ASP.NET系统缓存是应用程序全局的,而会话是当前用户唯一的。如果您选择使用全局缓存来存储对象,则需要创建一个对象识别策略,以便在每个用户基础上获取正确的对象。
如果您想增强性能,最好使用分布式内存缓存(如Microsoft的velocity)替换ASP.NET会话状态。微软已经发布了有关如何替换会话使用以针对Velocity的文章。您还可以类似地使用Memcache或其他类似产品。

2

会话对象适用于仅用户数据,而缓存对象更适合应用程序共享的数据。
关键是要确定您要存储的内容是否为仅限于某个用户或需要在整个应用程序中共享。

会话 => 具有逐步界面的网页(例如在线测试)。
缓存 => 以某种天气小部件显示的信息(就像google在其igoogle.com页面上拥有的那种)
希望这可以帮助。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接