最大大小为 1 的番石榴缓存
Guava Cache of maximum size 1
是否可以使用最大大小为 1 的 Guava 缓存?
我了解到,有时甚至在达到最大尺寸之前就可能发生驱逐。
但是,我只需要一个缓存条目。所以我想知道为安全但不过大的最大尺寸设置什么值。
您应该能够使用 Cache.cleanUp()
as explained in When Does Cleanup Happen? 并测试最大尺寸 1 是否满足您的需要。
例如下面显示了使用最大大小为 1 的 LoadingCache
不会驱逐现有条目,直到加载不同的条目来取代它:
final LoadingCache<Character, Integer> loadingCache = CacheBuilder.newBuilder()
.maximumSize(1)
.build(new CacheLoader<Object, Integer>() {
private final AtomicInteger loadInvocationCount = new AtomicInteger();
@Override
public Integer load(Object key) throws Exception {
return loadInvocationCount.getAndIncrement();
}
});
assert loadingCache.size() == 0;
assert loadingCache.getUnchecked('a') == 0;
assert loadingCache.size() == 1;
loadingCache.cleanUp();
assert loadingCache.size() == 1;
assert loadingCache.getUnchecked('a') == 0;
assert loadingCache.size() == 1;
assert loadingCache.getUnchecked('b') == 1;
assert loadingCache.size() == 1;
loadingCache.cleanUp();
assert loadingCache.size() == 1;
assert loadingCache.getUnchecked('a') == 2;
assert loadingCache.size() == 1;
loadingCache.cleanUp();
assert loadingCache.size() == 1;
请注意,这可能特定于正在构建的 LoadingCache
类型,因此您需要测试您计划使用的任何配置。
是否可以使用最大大小为 1 的 Guava 缓存?
我了解到,有时甚至在达到最大尺寸之前就可能发生驱逐。
但是,我只需要一个缓存条目。所以我想知道为安全但不过大的最大尺寸设置什么值。
您应该能够使用 Cache.cleanUp()
as explained in When Does Cleanup Happen? 并测试最大尺寸 1 是否满足您的需要。
例如下面显示了使用最大大小为 1 的 LoadingCache
不会驱逐现有条目,直到加载不同的条目来取代它:
final LoadingCache<Character, Integer> loadingCache = CacheBuilder.newBuilder()
.maximumSize(1)
.build(new CacheLoader<Object, Integer>() {
private final AtomicInteger loadInvocationCount = new AtomicInteger();
@Override
public Integer load(Object key) throws Exception {
return loadInvocationCount.getAndIncrement();
}
});
assert loadingCache.size() == 0;
assert loadingCache.getUnchecked('a') == 0;
assert loadingCache.size() == 1;
loadingCache.cleanUp();
assert loadingCache.size() == 1;
assert loadingCache.getUnchecked('a') == 0;
assert loadingCache.size() == 1;
assert loadingCache.getUnchecked('b') == 1;
assert loadingCache.size() == 1;
loadingCache.cleanUp();
assert loadingCache.size() == 1;
assert loadingCache.getUnchecked('a') == 2;
assert loadingCache.size() == 1;
loadingCache.cleanUp();
assert loadingCache.size() == 1;
请注意,这可能特定于正在构建的 LoadingCache
类型,因此您需要测试您计划使用的任何配置。