【问题标题】:Infinispan, the versioned operation returning incorrect resultsInfinispan,版本化操作返回不正确的结果
【发布时间】:2014-02-10 00:44:54
【问题描述】:

我们计划在客户端服务器模式下使用 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
---------------------

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

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

【问题讨论】:

  • 否,版本与密钥相关联。测试可能有问题。请在测试执行前添加清除操作,以确保测试前缓存为空。
  • 如果您仍然认为有问题,请在 org.infinispan 包上启用 TRACE 登录服务器并将日志链接到此处。
  • @Flavius 我已经启用了跟踪但是太多了,我可以把它粘贴在这里
  • 当然,跟踪日志很冗长。将其压缩并上传到 Dropbox,然后只发布链接。
  • @Flavius 请在这里找到测试类和日志dl.dropboxusercontent.com/u/107000372/Test.zip

标签: java caching jboss infinispan


【解决方案1】:

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

【讨论】:

  • 如果您在文档中发现了一些另有说明的信息,请发送相关链接,我们将予以修复。
  • 谢谢。这意味着 Infinispan 正在为整个缓存权而不是单独的键维护单个原子变量?
  • 不,每个条目(键+值)都有一个数字(长),这是当前版本。但是,当条目被覆盖时,它会获得一个新版本,设置为从原子计数器检索到的下一个数字,该数字仅适用于整个缓存。
猜你喜欢
  • 1970-01-01
  • 2012-04-11
  • 2016-02-06
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多