我需要获取依赖于多个服务调用的数据,例如
getInsurancyPrice(id, priceType) {
// any call of this method can throw a "NotFoundException"
user = getUser(id);
car = getCar(user);
insurancyCompany = getInsurancyCompany(user, car);
price = getPrice(insurancyCompany, priceType);
return price;
}
由于这些调用成本高昂且不太可能改变,我想使用缓存(有一些到期时间)。
理想情况下,我希望getInsurancyPrice(1,1)在第一次调用时获取所需的所有内容,并在所有进一步调用时返回与第一次调用相同的内容(即使它是NotFoundException - 即负缓存)
还有另一个细节:
假设我在调用getInsurancyPrice(1,1)后调用getInsurancyPrice(1,2)...没有理由运行该方法的前3个调用,因为它们不依赖于“priceType”(所以我应该已经有了保险公司缓存)。我想在这种情况下只使用预先计算的值来调用getPrice()方法
我试图避免让getUser()和getCar()甚至点击缓存,因为我可以直接跳到缓存中的getInsurancyCompany()调用
我可以想办法在很糟糕的设计中使用很多“if”来做到这一点..但是有一些更好的设计模式可以帮助我吗?
答案 0 :(得分:1)
使用Guava's LoadingCache。这确实是到期时间,还有更多。
为您进行的每个通话使用一个缓存实例。使用简单的复合对象作为带有多个参数的方法的键,这样就可以将它们传递给加载器。
对于第二部分,我会避免担心不必要的缓存。这种缓存的重点在于,如果有一个命中率,它的速度非常快 - 比数据库调用或对某些外部系统的HTTP调用快几个数量级。只需点击缓存即可。