用于最小化依赖服务上的缓存命中的设计模式

时间:2017-06-24 04:51:21

标签: java caching guice

我需要获取依赖于多个服务调用的数据,例如

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”来做到这一点..但是有一些更好的设计模式可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

使用Guava's LoadingCache。这确实是到期时间,还有更多。

为您进行的每个通话使用一个缓存实例。使用简单的复合对象作为带有多个参数的方法的键,这样就可以将它们传递给加载器。

对于第二部分,我会避免担心不必要的缓存。这种缓存的重点在于,如果有一个命中率,它的速度非常快 - 比数据库调用或对某些外部系统的HTTP调用快几个数量级。只需点击缓存即可。