【发布时间】:2014-03-12 15:03:23
【问题描述】:
我是 Guava 缓存的新手,正在寻求一些建议。
我想缓存“函数”——负责某些计算的类。每个类都有 3 个双重属性:start、max、increment
创建用于存储在缓存中的密钥的最佳方法是什么?复杂对象呢?
我正在考虑使用 Hasher,但对于复杂对象,相同的哈希并不意味着相同的对象。所以key->值不会是唯一的。
另外,Cache 是如何查找密钥的? 我注意到,如果我使用 2 个对象作为传递等于的键,缓存认为它是唯一键。它是否基于 key1 == key2 工作?
public static void testGuavaCache() {
Cache<Object, String> CACHE = CacheBuilder.newBuilder().weakKeys().weakValues().build();
for (int i = 0; i < 2; i++) {
Joiner joiner = Joiner.on('|');
String key1 = joiner.join(i, i, i, i, i, i, i);
for (int j = 0; j < 2; j++) {
String key = joiner.join(i, i, i, i, i, i, i);
System.out.println(key1.equals(key));
System.out.println(key1 == key);
try {
String m = CACHE.get(key, new Callable<String>() {
@Override
public String call() throws Exception {
return "test";
}
});
System.out.println("Size = " + CACHE.size());
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
}
输出是:
true
false
Size = 1
true
false
Size = 2
true
false
Size = 3
true
false
Size = 4
删除weakKeys() 解决了这个问题。这是预期的吗?
【问题讨论】:
-
创建对象真的很昂贵吗?如果没有,则忘记任何缓存并根据需要重新创建。