我是Guava缓存的新手,阅读完文档后我很困惑 https://code.google.com/p/guava-libraries/wiki/CachesExplained
将缓存加载器与加载方法的使用与使用带可调用的get(K,Callable)的get方法加载密钥(如果它不存在于缓存中)之间的区别是什么。
对我而言,它们都与加载密钥的目的相同。无法从the doc doc中找到两者之间的差异。 有人可以帮忙吗。
答案 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
可能是更好的主意。
如果你有一个缓存方法来创建一个单独的类实现的新实例,并且你不想使用switch
或if
链,你会使用get(Object, Callable)
。
您应该使用加载方法,因为它不需要实例化Callable
每个get
。