相等的键触发缓存负载超过预期
equal keys trigger cache load more than expected
也许我完全误会了 cache2k 的工作原理。我想缓存非常昂贵的操作的结果,但即使使用相同的键,结果总是会再次生成。首先我认为,键并不真正相等,但即使 equals() 返回 true,缓存似乎认为我想要新结果。
import org.cache2k.Cache;
import org.cache2k.CacheBuilder;
import org.cache2k.integration.CacheLoader;
import org.junit.Test;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class MyCacheTest {
private static int count = 0;
Cache<MyCacheTest.MyKey, Integer> cache = (Cache) CacheBuilder.newCache(MyCacheTest.MyKey.class,
Integer.class)
.expiryDuration(1, TimeUnit.HOURS)
.loader(new CacheLoader<MyCacheTest.MyKey, Integer>() {
@Override
public Integer load(MyCacheTest.MyKey p) throws Exception {
return costlyOperation(p);
}
})
.build();
private Integer costlyOperation(MyKey p) {
count ++;
return 1;
}
public class MyKey {
Date date;
@Override
public boolean equals(Object o) {
return true;
}
}
// OK
@Test
public void testEquals() {
assertTrue(new MyKey().equals(new MyKey()));
}
// FAIL, somehow calls costlyOperation twice
@Test
public void testCostlyOperationCalledOnlyOnce() {
cache.get(new MyKey());
cache.get(new MyKey());
assertEquals(count, 1);
}
}
这很可能是我的误会,请有人解释为什么这不像我预期的那样有效。
您实施了 equals
但未实施 hashCode
,并且此缓存实施使用 hashCode
。
添加:
@Override
public int hashCode() {
return 0;
}
到 MyKey
给出了预期的行为。
(使用 0.26-BETA 版测试)
也许我完全误会了 cache2k 的工作原理。我想缓存非常昂贵的操作的结果,但即使使用相同的键,结果总是会再次生成。首先我认为,键并不真正相等,但即使 equals() 返回 true,缓存似乎认为我想要新结果。
import org.cache2k.Cache;
import org.cache2k.CacheBuilder;
import org.cache2k.integration.CacheLoader;
import org.junit.Test;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class MyCacheTest {
private static int count = 0;
Cache<MyCacheTest.MyKey, Integer> cache = (Cache) CacheBuilder.newCache(MyCacheTest.MyKey.class,
Integer.class)
.expiryDuration(1, TimeUnit.HOURS)
.loader(new CacheLoader<MyCacheTest.MyKey, Integer>() {
@Override
public Integer load(MyCacheTest.MyKey p) throws Exception {
return costlyOperation(p);
}
})
.build();
private Integer costlyOperation(MyKey p) {
count ++;
return 1;
}
public class MyKey {
Date date;
@Override
public boolean equals(Object o) {
return true;
}
}
// OK
@Test
public void testEquals() {
assertTrue(new MyKey().equals(new MyKey()));
}
// FAIL, somehow calls costlyOperation twice
@Test
public void testCostlyOperationCalledOnlyOnce() {
cache.get(new MyKey());
cache.get(new MyKey());
assertEquals(count, 1);
}
}
这很可能是我的误会,请有人解释为什么这不像我预期的那样有效。
您实施了 equals
但未实施 hashCode
,并且此缓存实施使用 hashCode
。
添加:
@Override
public int hashCode() {
return 0;
}
到 MyKey
给出了预期的行为。
(使用 0.26-BETA 版测试)