等于键触发缓存加载超过预期

时间:2016-06-10 11:41:49

标签: java cache2k

也许我完全误导了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);
  }
}

这很可能是我的误解,有人请解释为什么这不符合我的预期。

1 个答案:

答案 0 :(得分:2)

您实施了$posts = $posts->leftJoin('mh_posts_params','mh_posts.id', '=', 'mh_posts_params.post_id') ->whereRaw('mh_posts_params.param_id <> ? OR mh_posts_params.param_id IS NULL', [$query->param__not_in()]) ->select('name', 'other_filed', 'another_one' ...); 但未equals,此缓存实施使用hashCode。 添加:

hashCode

@Override public int hashCode() { return 0; } 会给出预期的行为。

(使用0.26-BETA版本测试)