我们计划在客户端服务器模式下使用 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
---------------------
但是一旦我向同一缓存添加新的不同 key ,旧 key 的版本就会错误地给出
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
---------------------
看起来版本正在变化,与 key 无关,但缓存除外。因为在插入不同的 key 来缓存时,现有的版本也会发生变化。
更新:- 这不是一个错误,这是预期的行为,请参阅答案及其讨论。
最佳答案
这是预期的行为。当您将新条目写入缓存时,它会获得一个新版本。新版本是从原子计数器获得的,这确保总是生成一些新版本。除非调用 getWithVersion,否则您无法知道这个新版本。
关于java - Infinispan,版本化操作返回不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21522203/