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

标签 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
---------------------

但是一旦我向同一缓存添加新的不同 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/

相关文章:

java - @XmlAnyElement 和 @XmlElementRefs

java - java中的结构化数据

java - Java 中不可编辑的 ParagraphView

HTTP Cache-Control 和 params 顺序

java - Apache Beam 中的缓存 : Static variable vs Stateful processing

java - 将 android studio 上的 SQLite 数据库与 Web 服务器上的 MySQL 数据库同步

java - 缓存大量有序集合

postgresql - JBoss 日志 Postgres 驱动是 "non-JDBC-compliant"

hibernate - JBoss AS 7 迁移 - java.lang.ClassNotFoundException : org. hibernate.validator.ClassValidator

java - JBoss AS 7 中的 war 部署