【问题标题】:ASP.NET Web Api: Exposing a large, static collection across requestsASP.NET Web Api:跨请求公开大型静态集合
【发布时间】:2015-05-20 06:12:35
【问题描述】:

我们有一个 API(具体来说是 ASP.NET Web Api 2),它需要以某种算法方式遍历非常大的实体集合,以便研究所需的结果。

对于执行的每个查询,此集合都是相同的。它为每次调用形成数据“源”。

集合的属性:

  • 已订购
  • 大型(数十万个对象)
  • 只读
  • 必须可由应用程序池中的并发线程独立遍历
  • 集合中的项目是仅由少数值类型组成的对象。

每次向 API 发出请求时从磁盘或数据库中读取此集合会导致大量开销。所以,我们静态地坚持它,几乎是一个单例。这似乎起作用,因为静态对象在对应用程序的所有请求之间共享,并且与应用程序域具有相同的生命周期。这会导致来自 API 的几乎即时请求。

对于此类问题是否有更好的模式、实践或框架?

【问题讨论】:

  • 您是否尝试过使用异步操作?
  • 另一种方法是使用某种缓存 - 特别是 ApplicationState 用于存储整个应用程序的生命周期。
  • 根据您设置的架构类型,您也许可以将您的集合存储在 Redis 中。这会将内存使用卸载到 Redis,从而使您的应用程序无需管理内存中的大型数据集。您可以在 Redis 存储上设置 TTL 或在应用程序重新启动时删除对象。
  • @Praval'Shaun'Tirubeni:但是从 Redis 读取大量集合不会是性能开销(与将它放在内存中相比)吗?

标签: c# asp.net .net .net-4.5 asp.net-web-api2


【解决方案1】:

您可以使用 Redis 或 meccached 等缓存服务器。

在这个 SO 中,您可以对它们进行比较,这也将解释它们的全部意义,以及与您当前的实现有何不同:Memcached vs. Redis?

当然,这里有每个官方网站:

甚至还有第三个竞争对手:hazelcast

【讨论】:

    【解决方案2】:

    如果您真的不需要刷新数据,那么您的解决方案就可以了。

    但只有在您必须扩展到多个 Web 服务器之前。达到这一点,您可能需要确保所有 Web 服务器都具有相同的数据,并且 - 根据您的环境和架构 - 这可能会很棘手。也许如果你能达到这一点,你会问另一个关于 SO 的问题......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 2016-06-30
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 2020-07-06
      相关资源
      最近更新 更多