我有一个实现命令对象模式的应用程序来从服务器获取数据。现在我想实现一个客户端缓存,我需要一些关于如何处理缓存驱逐无效的指针。
问题
要获取对象,我传递GetObject(id)命令并接收带有该id结果的GetObjectResponse。我有一个缓存,可以很好地缓存GetObject(id)的响应。
但是,当我看到像DeleteObject(id)或UpdateObject(id)这样的命令时,需要使GetObject(id)的缓存响应无效。
我应该说现实并不一定就像使用单个id参数一样简单。某些响应对象依赖于命令对象中的多个参数。此外,传递一个命令对象可能会使多个响应对象失效。
有关如何实现这一目标的任何想法?提前谢谢!
答案 0 :(得分:0)
首先,问题称为缓存失效,而不是驱逐。 (我看到你使用这两个术语。)缓存驱逐意味着当缓存已满时从缓存中删除元素。这是一个完全不同的主题。
其次,我没有看到命令模式和缓存之间的连接。无论如何,让我们专注于缓存。
当使元素无效时,您必须在缓存中找到它。这与检索元素的方式相同:通过使用缓存键查找值。这样的密钥可以是你提到的id,或者其他一些独特的值元组。这个id或元组的外观取决于你的域(你使用命令模式的方式)。
关于您的上一期,必须有一条规则,告诉您在某个其他元素失效时哪些元素无效。这取决于命令模式应用程序背后的逻辑。我无法从你的描述中看出这样的规则究竟是什么样的。
答案 1 :(得分:0)
据我了解,您的客户端需要具有服务器状态的本地缓存。 当服务器状态更改时,您的客户端需要得到通知和更新。 我的建议是从使整个缓存无效的极端情况开始,然后以更小更精细的方式更新缓存,而不发送整个服务器状态。进行更精细更新的想法是“标记”服务器状态的每个更改,以便客户端可以发送他的最后一个标记,然后服务器可以根据他当前的标记计算更新客户端的最佳方式(整个更新或只是字段)。
答案 2 :(得分:0)
我最后用这个方法编写了一个CacheInvalidationGenerator类:
public ArrayList<Action> getInvalidForAction(Action action) {
ArrayList<Action> result = new ArrayList<Action>();
if (action.getClass()==UpdateObject.class) {
UpdateObject a = (UpdateObject) action;
result.add(new GetObject(a.getObjectId()));
}
return result;
}
该方法只返回要从缓存中失效的操作对象。当然,这些也可以生成失效,因此应该递归调用此方法。