【问题标题】:Caching user data in asp.net application在 asp.net 应用程序中缓存用户数据
【发布时间】:2011-07-26 23:30:32
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: asp.net caching


    【解决方案1】:

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

    另外,当您使用Session not in-process 时,它最终会被序列化 发送到进程外或发送到数据库,然后反序列化检索到时,并且您正在有效地执行上述操作:

    ... 更新会更慢,因为我有 重新存储整个字典时 它改变了。 ...

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

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

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

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

    【讨论】:

    • 服务器场是一种可能性(尽管站点现在在内部托管在单个实例上)-如果缓存在一个服务器上的某些内容在另一台服务器上不可用,实际上并没有任何后果(它只是看起来再次从数据库中提取)。听起来不错。
    【解决方案2】:

    最好将您的信息放入 memcached 以实现可扩展性

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-29
      • 2018-07-05
      • 2012-10-28
      • 2023-04-08
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多