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

时间:2014-02-03 07:55:40

标签: java caching jboss infinispan

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

看起来版本正在改变,无论密钥如何,但对于缓存。因为插入不同的密钥来缓存现有的版本也会发生变化。

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

1 个答案:

答案 0 :(得分:2)

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