3.2. RemoteCache API
集合方法 keySet
、entrySet
和 值
由远程缓存支持。也就是说,每种方法都调用回 RemoteCache
。这很有用,因为它允许准确检索各种键、条目或值,如果用户不希望,则不必将它们全部存储在客户端内存中。
这些集合遵循正在添加的 Map
规格,而不支持
,但所有其他方法都被支持。
add
All
要注意的一件事是 Iterator.remove
和 Set.remove
或 Collection.remove
方法需要超过 1 个往返操作。您可以检查 RemoteCache Javadoc,以查看这些和其他方法的更多详情。
迭代器使用情况
这些集合的迭代方法在内部使用 retrieveEntries
,如下所述。如果您注意到 retrieveEntries
使用批处理大小的参数。无法向迭代器提供此操作。因此,批处理大小可以通过系统属性 infinispan.client.hotrod.batch_size
配置,或者在配置 RemoteCacheManager
时通过 ConfigurationBuilder 配置。
另外,返回的 retrieveEntries
iterator 可以被关闭
,如来自 keySet
,entrySet
和 值
返回 AutoCloseable
变体。因此,在使用完这些"Iterator"时,您应该始终关闭这些"Iterator"。
try (CloseableIterator<Map.Entry<K, V>> iterator = remoteCache.entrySet().iterator()) { }
如果我想要深度副本而不是后备集合,该怎么办?
之前版本的 RemoteCache
允许检索 keySet
的深度副本。您仍然可以通过新的后备映射进行这一操作,只需自行复制内容。另外,您可以使用 entrySet
和 值
(在之前不支持)进行此操作。
Set<K> keysCopy = remoteCache.keySet().stream().collect(Collectors.toSet());
3.2.1. 不支持的方法
Data Grid RemoteCache
API 不支持 Cache
API 中的所有方法,并在调用不支持的方法时抛出 UnsupportedOperationException
。
大多数方法不适用于远程缓存(如侦听器管理操作),或者对应于本地缓存不支持的方法(例如,containsValue)。
RemoteCache
API 不支持从 ConcurrentMap
继承的某些原子操作,例如:
boolean remove(Object key, Object value); boolean replace(Object key, Object value); boolean replace(Object key, Object oldValue, Object value);
但是,remoteCache
为这些原子操作提供替代的方法,它们通过网络发送版本标识符,而不是整个值对象。