Guava 缓存:缓存加载器与 get(k,callable)

Guava cache : cacheloader vs get(k,callable)

我是Guava缓存新手,看了文档一头雾水 https://code.google.com/p/guava-libraries/wiki/CachesExplained.

使用带有加载方法的缓存加载器与使用带有可调用 get(K, Callable) 的 get 方法来加载缓存中不存在的键之间的区别是什么。

对我来说,它们都用于加载密钥的相同目的。无法从 w 文档中找到两者之间的差异。 有人可以帮忙吗

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

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

您最好使用加载方法,因为它不需要每个 get.

实例化一个新的 Callable

LoadingCache 的主要优点是它促进了通过缓存执行计算,而不是经常使用的活泼的获取然后计算然后放置方法。它向开发人员传达应该如何使用缓存。

在功能方面 LoadingCache 提供批量加载 (getAll)、非阻塞刷新和一些简洁性,例如 getUnchecked。刷新可以通过 refresh(key) 显式执行,也可以在构建阶段使用 refreshAfterWrite 隐式执行。

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

在性能方面没有太大区别。 get(key, callable) 在每次调用时都会在内部创建装饰器 CacheLoader 以适应 load,因此会创建一个伊甸园 space 对象。

在我的 Java 8 重写 Caffeine 中,有一些额外的选项。 AsyncLoadingCache 提供类似的 API 但 returns 提供 CompletableFuture。如果您需要更直接的控制,新的 Map 计算方法作为原子操作得到支持。

一般来说,更喜欢使用 LoadingCache 因为它与团队其他成员的交流特性。其他都是肉汁。