【问题标题】:Caching Data on a Heavy Load Web Server在负载较重的 Web 服务器上缓存数据
【发布时间】:2013-05-03 15:48:26
【问题描述】:

我目前有一个 Web 应用程序,它在每个页面请求中从数据库中获取当前登录用户的用户数据。

此 Web 应用程序可能有大约 30,000 个并发用户。

我的问题是最好缓存这个。例如在 C# 中使用System.Web.HttpRuntime.Cache.Add

或者这会削弱在内存中存储多达 30,000 个用户对象的服务器内存吗?

不缓存会不会更好,只在每次请求时从数据库中获取所需的数据?

【问题讨论】:

  • 一台机器上的 30k 用户听起来很糟糕。恕我直言,您应该将该作业拆分到多个服务器上。
  • 负载将被拆分,粘性会话。但我正在考虑将所有这些数据都保存在内存中的含义,即使它是拆分的。
  • 如果可能,您应该强烈考虑避免粘性会话。 Sticky Sessions 是一种众所周知的用于构建可扩展 Web 服务器的反模式。如果有什么特别的东西驱使您进行粘性会话,您应该尝试想出另一种方法。

标签: database performance design-patterns caching database-performance


【解决方案1】:

在这种规模下,您需要明确的缓存和扩展策略。将缓存组合在一起不同于计划明确的策略。破解缓存将失败。

缓存高度依赖于数据。数据是否经常变化?您将拥有多少读写比率?您将如何扩展您的数据库?如果您的网络场中的服务器具有不同的数据值,会发生什么情况?缓存一致性很重要吗?

您最终可能会得到几种不同类型的缓存:

  1. IIS 静态缓存
  2. ASP.Net 缓存
  3. 应用程序中的 LRU 缓存。
  4. 内存中的分布式缓存,例如 MemCacheD。
  5. 浏览器中的 HTTP 缓存。

此外,如果您提供静态数据(图片、CSS、Javascript 等),则需要与 CDN 集成以进行交付。使用 AWS S3 或 Azure 存储很容易做到这一点。

您还需要确保从一开始就计划如何向外扩展。您可能希望使用Elastic Bean StalkAzure's Websites Infrastruture 部署到AWS 等云提供商。

【讨论】:

    【解决方案2】:

    如何根据可用内存设置一些有限的缓存。并在其上编写 LRU(最近最少使用)算法。它可以提高性能,尤其是对于经常访问的用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 2011-01-05
      • 2016-11-10
      • 2011-09-05
      • 2011-09-21
      • 2019-01-28
      相关资源
      最近更新 更多