【问题标题】:.Net MVC Controller force cache refresh depending on situation.Net MVC 控制器根据情况强制刷新缓存
【发布时间】:2012-11-07 23:21:37
【问题描述】:

我有一个控制器操作,它返回一组测试的一系列测量值的平均值。控制器基本上从指定组内的所有测试中获取数据点,然后返回所有数据点的平均值。测试会定期添加到测试组。

我想优化我的控制器,以便它缓存结果(因为如果数据没有更改,那么在每个请求上查询数据库的意义何在?)并且仅在收到请求和新的请求时重建缓存测试已添加到测试组。我的表结构(简化)如下。

实现这一目标的最佳方法是什么?

TEST_GROUP
------------
group_name
group_id

TEST
-------------
test_id
group_id
test_date

DATA
--------------
test_id
measurement_number
measurement

【问题讨论】:

  • 您的 SQL 性能是否不佳?如果不是,那么在这里重新编写代码没有意义。无论哪种方式,您都需要访问数据库;获取所有数据或查看是否有新数据。更不用说如果它的性能不差,你实际上是在添加一个额外的数据库查询来确定是否有任何数据发生了变化。
  • @Ek0...表现不佳。我在问题中提供的是我正在尝试的简化版本。假设我平均为 10,000,000 点。如果平均值没有改变,我不想在每次请求平均值时查询整个数据库。但是,如果从新完成的测试中将 10,000 个测量值添加到数据集中,那么我别无选择,只能查询数据库以获取更新的平均值。也许我的问题应该是是否有办法检查缓存版本的创建日期?
  • 在这种情况下,您可以缓存一段特定的时间(在我的答案中发布),或者您可以访问数据库并执行行数(假设会合理执行)然后只获取有新数据时的数据(您可以将行数存储在缓存中,以便进行比较)。
  • 新数据会不规律地出现,很可能在很长一段时间(几天、几周,也许永远不会)之后。是否可以让缓存永不过期,然后在每个请求上检查缓存数据的时间戳?然后我可以根据组中最后一次测试的时间戳检查该值,然后仅在必要时重新计算?
  • 当然,你可以缓存一些东西很长一段时间。我用代码更新了我的答案。

标签: asp.net-mvc caching controller asp.net-optimization


【解决方案1】:

如果特定时间段的缓存满足您的需求,您可以在视图级别通过执行以下操作来完成此操作:

[OutputCache(Duration = 300)] //Cache for 5 minutes.
public ActionResult Average() {
    //Do your stuff!
}

另一种选择是只缓存您需要的数据:

HttpRuntime.Cache.Insert(key, value, null, DateTime.MaxValue, System.Web.Caching.Cache.NoSlidingExpiration);

请注意,在最后一个示例中,最大缓存可能会过期,除非您有一个非常活动的应用程序,或者如果您的 configure the application pool 进程没有空闲关闭。

【讨论】:

    【解决方案2】:

    如果没有数据库访问,您将无法确定是否有新记录。如果您想在控制器上提供基于时间的缓存,请查看 OutputCaching。我不相信您在操作中使用了任何参数,但如果您使用了,您可以增加缓存的时间量并因参数而异,以确保在传入新参数时单独获取结果。

    在此处查看输出缓存文章:

    http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/improving-performance-with-output-caching-cs

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 2016-11-25
      • 2020-09-17
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2015-10-28
      相关资源
      最近更新 更多