使用代理调用之间的关系在代理中缓存和清除

时间:2009-01-27 13:21:04

标签: caching

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

在清除缓存时会变得更加复杂,因为在项目更改时清除哪些项目并不明显。如果对象A包含在节点集B中并且对象A被更改,我们如何知道节点集B是陈旧的。

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

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

1 个答案:

答案 0 :(得分:1)

不是那种可以(并且应该)用Observer模式处理的东西吗?也就是说,B应该听取影响它活力的事件,在这种情况下是A的状态。

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

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

你没有说你正在运行什么平台,但也许我们可以提出一些替代方案来推动你自己,这总是会遇到问题,尤其是像缓存一样复杂的事情(不要搞错:缓存很复杂。)