【发布时间】: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