何时适合使用CacheItemRemovedCallback?

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

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

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

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

  2. 删除项会触发回调。

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

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

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

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

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

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

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

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

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