2010-09-17 97 views
6

我有一个每天更新一次的大型数据集。我正在缓存对该数据的昂贵查询的结果,但我想每天更新该缓存。我使用CacheItemRemovedCallback重装我是每天间隔缓存考虑,但我有以下的忧虑:何时适合使用CacheItemRemovedCallback?

  1. 是不是有可能是CacheItemRemovedCallback可能我届满前调用(运行内存不足的情况下, )?这意味着立即重新加载它似乎不是一个好主意。
  2. CacheItemRemovedCallback是否在实际删除项目之前或之后被调用?如果它在后面,这理论上不会在缓存不可用的时间段内留下一段时间吗?

这些问题是否相关,如果使用CacheItemRemovedCallback重新加载缓存是个坏主意,那么它何时有用?

回答

2

从大家的反应和进一步阅读中,我得出的结论是:

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

看来,CacheItemUpdateCallback是定期刷新缓存的更合适的方式。

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

+0

那么'CacheItemRemovedCallback'还有其他实际用途 - 不仅仅是日志记录。举例来说,当缓存项目被移除时,您想要处理的缓存项目保留了外部参考。如果你不使用CacheItemRemovedCallback,那么你将不得不单独依靠垃圾收集器,它在执行时不提供保证(如果在程序生命周期中)。 – 2011-12-29 14:12:48

1
  1. 是的,这种方法可能因各种原因而被解雇。但是,加载或等待再次加载缓存将取决于您的应用程序中最适合您典型用例的内容。

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

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

1

这实际上并不是单个值的缓存,因为它是整个数据集的快照。因此,您不会从这里使用Cache课程中受益。

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

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

  2. 回调被解雇该物品被移除后。