当前位置: 首页 > 知识库问答 >
问题:

Infinispan,版本化操作返回不正确的结果

柳涵映
2023-03-14

我们计划在客户机-服务器模式下使用Infinispan。该架构有许多客户端(客户端1、客户端2等)和分布式infinispan网络。

我们需要定期更新缓存中的数据,比如每5小时更新一次。所有客户端都可以更新数据。如果其中一个(比如客户端1)正在更新,我们需要防止其他人做同样的工作。更新完成后,所有客户端再等待5个小时,其中任何一个客户端都将再次进行更新。

Infinispan为此提供了版本化操作,但在测试过程中,该方法给出了无效的结果。

String key="test";
RemoteCacheManager cacheManager = new RemoteCacheManager();
RemoteCache<String, Object> remoteCache = cacheManager.getCache("MyCache");
remoteCache.put(key, new Object());
for (int i = 1; i < 5; i++) {
        System.out.println("version Before:" + remoteCache.getVersioned(key).getVersion());
        System.out.println("version to put:"+(i));
        System.out.println(remoteCache.replaceWithVersion(key, new Object(),i));
        System.out.println("version after:" + remoteCache.getVersioned(key).getVersion());
        System.out.println("---------------------");
}

这是给出正确的结果,

version Before:1
version to put:1
true
version after:2
---------------------
version Before:2
version to put:2
true
version after:3
---------------------
version Before:3
version to put:3
true
version after:4
---------------------

但是一旦我添加一个新的不同的密钥到相同的缓存版本的旧密钥是不正确的

for (int i = 1; i < 5; i++) {
    remoteCache.put("Hello", new Object());
    System.out.println("version Before:" + remoteCache.getVersioned(key).getVersion());
    System.out.println("version to put:"+(i));
    System.out.println(remoteCache.replaceWithVersion(key, new Object(),i));
    System.out.println("version after:" + remoteCache.getVersioned(key).getVersion());
    System.out.println("---------------------");

}

version Before:1
version to put:1
true
version after:3
---------------------
version Before:3
version to put:2
false
version after:3
---------------------
version Before:3
version to put:3
true
version after:6
---------------------
version Before:6
version to put:4
false
version after:6
---------------------

看起来版本正在更改,而与缓存无关。因为在插入不同的密钥以缓存现有版本时也会发生变化。

更新:-这不是一个bug,这是预期的行为,请参阅答案及其讨论。

共有1个答案

贺华容
2023-03-14

这是预期行为。当您将一个新条目写入缓存时,它将获得一个新版本。从原子计数器获得新版本,确保始终生成一些新版本。除非调用getWithVersion,否则无法了解此新版本。

 类似资料:
  • 我正在使用postgis计算两个地理坐标之间的距离。 它返回给我53536.743496517米,大约等于54公里,但实际距离是103公里,我通过http://boulter.com/gps/distance/ 我在询问中是否做错了什么?

  • 我正在尝试在代码中使用NSPredicate搜索名称。搜索工作正常,但不会返回适当的结果。当我搜索一个名称(例如“Colin”)时,它会返回表中的所有其他名称或另一个名称(例如“Mike”),但如果我输入一个不存在的随机字符串,它会返回:“找不到结果”。当我在搜索栏中键入一个名字(例如Lisa)时,我希望它能找到这个名字(Lisa)并返回它,但它没有这样做 这是我的代码: 自己name返回表中的所

  • 以下是我的疑问.... 我没有结果。 另外,我正在使用这个插件来生成请求正文。 我的查询如下所示.. null 感谢您到目前为止的阅读,如果有人能帮助我找出如何使这一工作,我将非常感谢。

  • 据我所知,Java中的运算符比较对象的引用()。 此值是中方法的默认实现返回的值。 方法有一个实现说明: 为什么和 而且,一个极度厌恶风险的人如何确保上面的假阳性永远不会发生?如果类至少有一个非静态字段,则可以重写和。但是,如果不是这样(就像上面的类一样)呢? 你能解释一下我在这里漏掉了什么吗? 为添加API注释(取自Silvio的答案): 这通常是通过将对象的内部地址转换为整数来实现的,但Jav

  • 问题内容: def size_of_dir(dirname): print(“Size of directory: “) print(os.path.getsize(dirname)) 是有问题的代码。dirname是一个目录,其中包含 130个 文件,每个文件约 1kb 。当我调用此函数时,它返回 4624 ,这 不是 目录的大小…为什么? 问题答案: 此值(4624B)代表的大小 文件 是 描

  • 当我尝试使用Google geocode api对其中一个地址进行地理编码时,Google api返回了一个错误的位置。 搜索地址:爱沙尼亚共和国 结果来自google api:西班牙 我正在使用javascript Google api对地址进行地理编码。对于其他位置,结果是正确的,但对于上述地址,结果是不正确的。 如果我们在浏览器中输入下面的url,我们会得到JSON,它会在西班牙的某个地方显