0

在一个键值的大规模更新期间,我正在努力解决 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

有谁知道问题出在哪里?也许是错误类型的缓存?也许错误的锁定选项?

4

0 回答 0