第 4 章 热备份客户端 API
Data Grid Hot Rod 客户端 API 提供了接口,用于远程创建缓存、操作数据、监控集群缓存拓扑等。
4.1. RemoteCache API 复制链接链接已复制到粘贴板!
集合方法 keySet、entrySet 和 值 由远程缓存支持。也就是说,每个方法都会重新调用到 RemoteCache。这很有用,因为它允许检索各种密钥、条目或值,而且如果用户不需要同时存储在客户端内存中。
这些集合遵循了添加和 的 add Allmap 规格,但不支持所有其他方法。
要注意的是,Iterator.remove 和 Set.remove 或 Collection.remove 方法需要超过 1 轮向服务器进行操作。您可以检查 RemoteCache Javadoc,以查看这些文档及其他方法的详情。
迭代器使用情况
这些集合的迭代方法在内部使用 retrieveEntries,如下所述。如果您注意到 检索条目 使用批处理大小的参数。无法向迭代器提供这个方法。因此,在配置 RemoteCacheManager 时,可以通过系统属性 infinispan.client.hotrod.batch_size 或 ConfigurationBuilder 来配置批处理大小。
另外,返回的 retrieveEntries itator 为 Closeable,因为 keySet、entrySet 和 values 中的迭代程序返回 AutoCloseable 变体。因此,当您使用它们时,您应始终关闭这些"迭代"。
try (CloseableIterator<Map.Entry<K, V>> iterator = remoteCache.entrySet().iterator()) {
}
try (CloseableIterator<Map.Entry<K, V>> iterator = remoteCache.entrySet().iterator()) {
}
如果我想要一个深度副本而不是后备集合,会怎么办?
早期版本的 RemoteCache 允许检索 keySet 的深度副本。使用新的后备映射仍有可能,您只需要自行复制内容。您还可以使用 entrySet 和 值 进行此操作,在之前我们不支持它。
Set<K> keysCopy = remoteCache.keySet().stream().collect(Collectors.toSet());
Set<K> keysCopy = remoteCache.keySet().stream().collect(Collectors.toSet());
4.1.1. 不支持的方法 复制链接链接已复制到粘贴板!
Data Grid RemoteCache API 不支持 Cache API 中所有可用的方法,并在调用不支持的方法时抛出 UnsupportedOperationException。
这些方法中的大多数方法不适用于远程缓存(例如,侦听器管理操作),或者对应于本地缓存不支持的方法(例如,包含Value)。
RemoteCache API 不支持从 ConcurrentMap 继承的特定 atomic 操作,例如:
boolean remove(Object key, Object value); boolean replace(Object key, Object value); boolean replace(Object key, Object oldValue, Object value);
boolean remove(Object key, Object value);
boolean replace(Object key, Object value);
boolean replace(Object key, Object oldValue, Object value);
但是,remoteCache 为这些原子操作提供了替代版本的方法,它们通过网络而不是整个值对象发送版本标识符。