作为我正在研究的系统的一部分,我们在代理中放置了一层缓存,调用另一个系统。此缓存的关键是由代理调用中使用的键值对构成。因此,如果使用相同的值调用代理,则将从缓存而不是从其他服务检索项。这很有效,也很简单。
在清除缓存时会变得更加复杂,因为在项目更改时清除哪些项目并不明显。如果对象A包含在节点集B中并且对象A被更改,我们如何知道节点集B是陈旧的。
通过让我们调用的服务返回节点集来清除对象被更改时,我们解决了这个问题。然而,这打破了封装并增加了一层复杂性,因为我们必须查看响应以查看需要清除的内容。
有没有更好/标准的方法来处理这种情况。
答案 0 :(得分:1)
不是那种可以(并且应该)用Observer模式处理的东西吗?也就是说,B应该听取影响它活力的事件,在这种情况下是A的状态。
Map是一个非常自然的缓存抽象,这就是Oracle Coherence和Terracotta的做法。我更熟悉的Coherence具有监听一般缓存事件或特定节点的缓存事件的机制。这可能是你应该效仿的。
您也可能希望查看其中任何一个的文档,即使它只是作为指导或想法的来源。
你没有说你正在运行什么平台,但也许我们可以提出一些替代方案来推动你自己,这总是会遇到问题,尤其是像缓存一样复杂的事情(不要搞错:缓存很复杂。)