代码之家  ›  专栏  ›  技术社区  ›  Code Commander

何时使用cacheitemremovedCallback合适?

  •  6
  • Code Commander  · 技术社区  · 16 年前

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

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

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

    4 回复  |  直到 14 年前
        1
  •  4
  •   Danny Tuppeny    14 年前
    1. 如果要重新加载,请确保检查cacheitemremovedReason。我最近不得不调试一个问题,在这个问题上,开发人员决定用这个方法立即重新填充缓存,在内存不足的情况下,它基本上是在占用CPU的同时陷入构建缓存对象的循环,将它们添加到缓存中,过期,重复。

    2. 回调被激发 之后 该项被删除。

        2
  •  2
  •   Code Commander    16 年前

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

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

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

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

        3
  •  1
  •   Dillie-O    16 年前
    1. 是的,由于许多不同的原因,方法可能会被取消。但是,重新加载或等待加载缓存将取决于应用程序中最适合您的典型用例的内容。

    2. cacheitemRemovedCallback确实激发了 之后 该项将从缓存中删除。对吗? 之前 要删除该项,可以使用cacheItemupateCallback方法确定是否要在此时刷新缓存。刷新缓存时可能需要等待很好的原因,例如您的应用程序中当前有用户,再次构建缓存需要很长时间。

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

        4
  •  1
  •   Steven Sudit    16 年前

    这实际上不是单个值的缓存,而是整个数据集的快照。因此,使用 Cache 在这里上课。

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