站点的动态业务对象是应该存储在用户会话中还是使用ASP.Net缓存(订单,配置文件信息等对象)?
我曾经使用会话来存储业务对象的网站,但我想知道......缓存有哪些优点或缺点?
答案 0 :(得分:24)
如果对象在用户会话之间可共享,则使用缓存。如果对象对每个会话都是唯一的 - 可能是因为它们受权限控制 - 然后将其存储在会话中。进程内会话本身存储在缓存中,因此决定因素确实应该是数据的范围。
答案 1 :(得分:7)
缓存只是 - 缓存。你永远不能依赖于那里的条目,所以在这方面不能做任何假设:准备直接进入DB(或其他任何地方)来重新获取数据。
另一方面,会话更适合存储对象,但我个人试图避免使用会话存储来支持数据库。我通常通过抽象不透明的 ISessionStoreService 接口后面的商店来做到这一点:interface ISessionStore
{
T GetEntry<T>(string key);
void SaveEntry<T>(string key, T entry);
}
然后“依赖注入”适当的实现,无论是 InmemorySessionStore , DbSessionStore 还是其他什么。
答案 2 :(得分:2)
ASP.NET系统缓存对应用程序是全局的,因为会话对于当前用户是唯一的。如果您选择使用全局缓存来存储对象,则需要创建对象识别策略,以便为每个用户获取正确的对象。
如果您希望提高性能,最好使用Microsoft的速度等分布式内存缓存替换ASP.NET会话状态。 Microsoft发布了有关如何将会话使用替换为目标Velocity的文章。您也可以以相关方式使用Memcache或其他类似产品。
答案 3 :(得分:2)
会话对象适用于仅用户数据,另一方面,Cache对象更适合应用程序共享的数据。
保存在一个或另一个中的关键是确定您尝试存储的内容是仅用户数据还是需要在所有应用程序中共享。
会话=&gt;具有分步界面的网页(例如在线测试) 缓存=&gt;某些天气小工具中显示的信息(例如谷歌在其igoogle.com页面中显示的信息) 希望这会有所帮助。
答案 4 :(得分:1)
虽然您可以将业务对象存储在Cache中,但Cache旨在提高性能而不是状态管理。想象一下,你有一个从数据库中获取1000条记录的过程(大约需要3秒钟),你需要它几分钟。您可以将对象存储在Cache中并设置过期日期,优先级和依赖关系(如SqlDependency或FileDependency),因此对于下一个请求,您可以使用缓存数据而不是从数据库中重新获取它。您可以将对象存储在Session中,但默认情况下不能为Session设置依赖关系。此外,Cache具有一种独特的行为,当系统需要内存时,它将根据其优先级从缓存中释放对象。缓存对象对应用程序是全局的,并且在所有用户之间共享,但Session不是共享的,并且它可用于每个用户(会话)。