在asp.net应用程序中缓存用户数据

时间:2011-03-31 14:44:23

标签: asp.net caching

在asp.net 4.0中缓存网站用户数据的最佳方法是什么?

我有一个用户设置表,可以跟踪各种用户或会话特定的内容,例如UI元素的状态(打开/关闭),首选项,某些对话框是否已被解除等等。由于这些不经常变化(对于每个用户,无论如何)但是经常被查找,因此缓存它们似乎是明智的。什么是最好的方式?这些是我发现的选项......

  1. 直接将它们存储在HttpContext.Current.Session(例如Session["setting_name"]
  2. 将它们存储在HttpContext.Current.Cache
  3. 使用全局静态字典,例如static ConcurrentDictionary<string,string>其中密钥是唯一的userID +设置名称值
  4. SessionCache
  5. 中为每个会话存储字典对象

    最明智的方法是什么?从实际角度来看,SessionCache的区别如何?将字典存储为单个会话/缓存对象而不是直接添加大量值是否有意义?我认为查找可能会更快,但更新会更慢,因为我必须在更改时重新存储整个字典。

    使用全局静态缓存可能会带来哪些问题或好处?这似乎是最快的,但我必须管理大小。如果它达到一定的大小,我可以定期冲洗它,或者保持交叉引用队列并在它达到一定大小时首先移除最旧的东西。这有什么意义,还是只是太努力了?

2 个答案:

答案 0 :(得分:1)

Session可能最终被存储在进程外或数据库中,这可能使得检索它变得昂贵。如果您的应用程序要托管在服务器场中,而不是单个服务器,则可能会使用会话数据库。服务器场提供了改进的可伸缩性和可靠性,并且它通常是常见的部署方案。你有没有想过这个?

此外,当您在进程中使用Session时,它最终会将序列化发送到进程外或数据库,并且反序列化在检索时,您有效地执行上述描述:

  

... 更新会因为我的速度而变慢   在什么时候重新存储整个字典   它改变了。 ......

..因为,即使你使用单独的会话密钥,用户的整个Session对象也会被序列化和反序列化(一次性完成)。

然而,Cache在服务器场中的特定服务器上将在内存中,因此比退出流程或数据库更有效。但是,一台服务器上的缓存中的某些内容可能不在另一台服因此,如果用户的后续请求被定向到服务器场中的另一个服务器,则该服务器上的缓存可能尚未保留任何用户的项目。

尽管如此,如果您因性能原因而进行缓存,我建议您使用Cache

P.S。是的,你太努力了。除非你真的需要,否则不要重新发明轮子。 : - )

答案 1 :(得分:-1)

可能更好地将您的信息放入memcached以获得可伸缩性