我可以在ehcache上使用isKeyInCache并将put方法替换putIfAbsent吗?
这是我的测试代码,性能差异很大
// putIfAbsent
time = System.nanoTime();
ehcache.putIfAbsent(new Element(assetUid, asset));
estimated = System.nanoTime();
System.out.println(estimated - time);
// isKeyInCache and put
time = System.nanoTime();
if (!ehcache.isKeyInCache(assetUid)) {
ehcache.put(new Element(assetUid, asset));
}
estimated = System.nanoTime();
System.out.println(estimated - time);
和控制台输出
1693409
18235
或者您还有其他建议吗?谢谢
最佳答案
简短的答案是putIfAbsent()将遵守锁和竞争条件(换句话说,是在某处同步),以确保仅在没有任何内容的情况下才确实放置该条目...或者当前正在由另一个线程编写等...
调用isKeyInCache不会。
从http://ehcache.org/apidocs/net/sf/ehcache/Ehcache.html#isKeyInCache(java.lang.Object):
“廉价的检查,以查看密钥是否存在于缓存中。
此方法不同步。元素可能存在于缓存中,并在检查到达之前被删除,反之亦然。由于没有对Element的状态进行断言,因此Element可能已过期,但是此方法仍然返回true。”
解释了时间差异...
综上所述,它实际上取决于您的用例...您是否可以接受这样的语句:“元素可能存在于缓存中,并在检查到达之前被删除,反之亦然”?如果是,请使用isKeyInCache()检查...
如果要在检查期间确定,请坚持使用putIfAbsent()...