第 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
为这些原子操作提供了替代版本的方法,它们通过网络而不是整个值对象发送版本标识符。