2011-03-31 84 views
2

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

我有一个用户设置表,跟踪所有类型的用户或会话特定的东西,如UI元素的状态(打开/关闭),首选项,某个对话框是否已被解除,等等。由于这些并不经常改变(对于每个用户,无论如何),但是经常查看,缓存它们似乎是明智的。最好的方法是什么?这是我已经确定的选项...

  1. 商店他们HttpContext.Current.Session直接(例如Session["setting_name"]
  2. 商店他们HttpContext.Current.Cache
  3. 使用全局静态辞典,例如static ConcurrentDictionary<string,string>其中关键是一个独特的用户ID +在SessionCache

什么是最明智的办法做到这一点的设置名称值

  • 商店的字典对象为每个会话? Session从实用角度与Cache有什么不同?将字典存储为单个会话/缓存对象而不是直接添加大量值是否合理?我认为查找可能会更快,但更新速度会更慢,因为当它更改时我不得不重新存储整个字典。

    使用全局静态缓存可能会有哪些问题或好处?似乎这将是最快的,但我不得不管理大小。我可以定期刷新它,如果它达到一定的大小,或者保留一个交叉引用队列,并在它达到一定大小时先删除最老的东西。这是否有意义,还是只是太努力了?

  • 回答

    1

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

    此外,当您使用Session没有进程,它最终得到系列化发送出去的进程或数据库,并检索时反序列化,你是有效做什么你在上面描述:

    ... 更新会比较慢,因为我不得不 重新存储整个字典时 它改变。 ...

    ..因为,即使你使用单独的会话密钥,整个Session对象为用户被串行化(一次全部)反序列化到一起。

    Cache将在内存上在服务器场中的特定服务器上,因此比离开进程或数据库要高效得多。但是,某个服务器上的缓存中的某些内容可能不在另一个缓存中。因此,如果用户的后续请求指向服务器场中的另一台服务器,则该服务器上的缓存可能尚未包含任何用户的项目。

    不过,如果您出于性能原因进行缓存,我建议您使用Cache

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

    +0

    服务器场是一种可能性(尽管网站现在托管在一个实例中) - 并且如果某个服务器上缓存的某些内容在另一个服务器上变得不可用,则不会有任何后果(它只是查看它从数据库中再次)。听起来像是要走的路。 – 2011-03-31 14:56:00

    -1

    可能会更好地把您的信息的memcached可扩展性

    相关问题