代码之家  ›  专栏  ›  技术社区  ›  Jeremy French

具有代理调用关系的代理中的缓存和清除

  •  0
  • Jeremy French  · 技术社区  · 16 年前

    作为我正在开发的系统的一部分,我们在调用另一个系统的代理中放置了一层缓存。此缓存的密钥由代理调用中使用的键值对组成。因此,如果使用相同的值调用代理,则将从缓存中检索项目,而不是从其他服务中检索项目。这很有效,而且相当简单。

    当涉及到清除缓存时,情况会变得更加复杂,因为当一个项目发生更改时,不清楚要清除哪些项目。如果对象A包含在节点集B中,并且对象A发生了变化,我们如何知道节点集B已经过时。

    我们通过让我们调用的服务在对象更改时返回节点集进行清除,从而绕过了这个问题。然而,这破坏了封装并增加了一层复杂性,因为我们必须查看响应中需要清除的内容。

    是否有更好/标准的方法来处理这种情况。

    1 回复  |  直到 16 年前
        1
  •  1
  •   cletus    16 年前

    这难道不是观察者模式可以(也应该)处理的事情吗?也就是说,B应该监听影响其活性的事件,在这种情况下是A的状态。

    Map是缓存的一种非常自然的抽象,Oracle Coherence和Terracotta就是这样做的。Coherence是我更熟悉的,它具有监听缓存事件的机制,无论是一般的还是特定节点的。这可能是你应该效仿的。

    您可能还想查看其中任何一个的文档,即使它只是作为指导或想法的来源。

    你不会说你在哪个平台上运行,但也许我们可以建议一些替代方案来滚动你自己的平台,这总是会充满问题,尤其是像缓存这样复杂的东西(毫无疑问:缓存很复杂)。