何时适合使用CacheItemRemovedCallback?

时间:2010-09-17 23:36:09

标签: c# asp.net-mvc

我有一个每天更新一次的大型数据集。我正在缓存对该数据进行昂贵查询的结果,但我想每天更新该缓存。我正在考虑使用CacheItemRemovedCallback每天重新加载我的缓存,但我有以下问题:

  1. 在我的到期之前是否可能调用CacheItemRemovedCallback(在内存不足的情况下)?这意味着立即重新加载它似乎不是一个好主意。
  2. 在实际删除项目之前或之后是否调用CacheItemRemovedCallback?如果它在之后,理论上这不会留下一段时间缓存不可用吗?
  3. 这些问题是否相关,如果使用CacheItemRemovedCallback重新加载缓存是一个坏主意,那么什么时候有用呢?

4 个答案:

答案 0 :(得分:4)

  1. 如果您要重新加载,请务必检查CacheItemRemovedReason。我最近不得不调试一个问题,开发人员决定他们应该立即在这种方法中重新填充缓存,并且在内存不足的情况下,它基本上会在CPU陷入构建缓存对象的循环中加入它们,添加它们到缓存,到期,重复。

  2. 在项目被删除后,会触发回调。

答案 1 :(得分:2)

从每个人的回答和进一步的阅读中我得出以下结论:

我的担忧是有效的。使用CacheItemRemovedCallback刷新缓存的项目不是一个好主意。此回调的唯一实际用途似乎是记录有关何时删除缓存的信息。

似乎CacheItemUpdateCallback是定期刷新缓存的更合适方式。

最终,我决定不使用其中任何一个电话。相反,我将编写一个服务操作,以便数据库导入作业可以在需要刷新其数据时通知我的应用程序。这样可以避免完全使用定时刷新。

答案 2 :(得分:1)

  1. 是的,有一个更改,该方法可能会因各种原因被解雇。但是,加载或等待再次加载缓存将取决于应用程序中典型用例的最佳用途。

  2. 在项目从缓存中删除后,CacheItemRemovedCallback确实触发。在删除项目之前 之前,您可以使用CacheItemUpateCallback方法来确定是否要在此时刷新缓存。可能有充分的理由等待刷新缓存,例如您当前在应用程序中有用户,并且需要花费很长时间再次构建缓存。

  3. 一般来说,最佳做法是在使用其数据之前测试缓存项目是否实际存在于缓存中。如果数据不存在,您可以在那时重建缓存(对用户造成稍长的响应)或选择执行其他操作。

答案 3 :(得分:1)

这实际上并不是单个值的缓存,因为它是整个数据集的快照。因此,您无法在此处使用Cache课程。

我建议在启动时加载静态集合,并通过设置计时器每24小时更换一次。我们的想法是创建一个新的集合并以原子方式分配它,因为旧的集合可能仍在使用中,我们希望它保持自我一致。