番石榴缓存:cacheloader vs get(k,callable)

时间:2015-08-29 05:57:36

标签: java caching guava

我是Guava缓存的新手,阅读完文档后我很困惑 https://code.google.com/p/guava-libraries/wiki/CachesExplained

将缓存加载器与加载方法的使用与使用带可调用的get(K,Callable)的get方法加载密钥(如果它不存在于缓存中)之间的区别是什么。

对我而言,它们都与加载密钥的目的相同。无法从the doc doc中找到两者之间的差异。 有人可以帮忙吗。

2 个答案:

答案 0 :(得分:4)

LoadingCache的主要优点是它促进了通过缓存执行计算,而不是通过使用racy get然后计算然后放置的方法来代替。它向开发人员传达应如何使用缓存。

功能明智的LoadingCache提供批量加载(getAll),非阻塞刷新,以及getUnchecked等简洁性。刷新可以通过refresh(key)显式执行,也可以在构建阶段使用refreshAfterWrite隐式执行。

当计算很复杂时,将逻辑移动到自己的类中会很好。通过扩展CacheLoader而不是Callable,它可以更好地传达意图。

表现明智,没有太大的区别。 get(key, callable)在内部为每个调用CacheLoader的调用创建一个装饰器load,因此创建了一个伊甸园空间对象。

在我的Java 8重写Caffeine中,还有一些其他选项。 AsyncLoadingCache提供类似的API但返回CompletableFuture。如果需要更多直接控制,则支持新的Map计算方法作为原子操作。

通常更喜欢使用LoadingCache作为其团队其他人的交流属性。其他一切都是肉汁。

答案 1 :(得分:2)

如果您希望使用相同的方法不断计算所有值,则使用CacheLoader可能是更好的主意。

如果你有一个缓存方法来创建一个单独的类实现的新实例,并且你不想使用switchif链,你会使用get(Object, Callable)

您应该使用加载方法,因为它不需要实例化Callable每个get