在对一个键进行大量值更新时,我一直在努力提高Infinispan缓存的一致性。
我的缓存是这样定义的(我尝试了其他选项和组合,但没有成功):
<replicated-cache name="refCounterCache" mode="SYNC" >
<locking isolation="READ_COMMITTED" write-skew="false"/>
<versioning scheme="SIMPLE"/>
</replicated-cache>
测试用例非常简单。在这样定义的缓存上:
Cache<String, Integer> refernceCounterCache = cacheManager.getCache("refCounterCache");
在其中一个节点中,我将密钥的初始密钥值设置为1000;
我调用每个键值递增2000倍的节点代码:
IntStream.range(0, 2000).forEach(i -> {
try {
refernceCounterCache.merge(key, 1, (vOld, vNew) -> vNew + vOld);
}
catch (Exception ex) {
log.error("Unexpected error during value merge!");
}
});
当我在单个节点群集(一个程序实例)上运行上述lambda代码时,一切正常(值3000)。集群中的两个节点也一样-得到相同的预期结果:5000
当我有两个以上的节点时,问题就开始了。如果3个节点同时增加,我会得到意想不到的结果,例如 6973 而不是 7000 。
有人知道问题出在哪里吗?也许错误的缓存类型?也许错误的锁定选项?