第 12 章 多映射缓存


MutimapCache 是数据网格缓存类型,可将键映射到值,每个键都可以包含多个值。

12.1. Multimap Cache

MutimapCache 是数据网格缓存类型,可将键映射到值,每个键都可以包含多个值。

12.1.1. 安装和配置

pom.xml

<dependency>
  <groupId>org.infinispan</groupId>
  <artifactId>infinispan-multimap</artifactId>
</dependency>
Copy to Clipboard Toggle word wrap

12.1.2. MultimapCache API

MultimapCache API 会公开几种与 Multimap 缓存交互的方法。这些方法在多数情况下是非阻塞的;如需更多信息,请参阅 限制

public interface MultimapCache<K, V> {

   CompletableFuture<Optional<CacheEntry<K, Collection<V>>>> getEntry(K key);

   CompletableFuture<Void> remove(SerializablePredicate<? super V> p);

   CompletableFuture<Void> put(K key, V value);

   CompletableFuture<Collection<V>> get(K key);

   CompletableFuture<Boolean> remove(K key);

   CompletableFuture<Boolean> remove(K key, V value);

   CompletableFuture<Void> remove(Predicate<? super V> p);

   CompletableFuture<Boolean> containsKey(K key);

   CompletableFuture<Boolean> containsValue(V value);

   CompletableFuture<Boolean> containsEntry(K key, V value);

   CompletableFuture<Long> size();

   boolean supportsDuplicates();

}
Copy to Clipboard Toggle word wrap

CompletableFuture<Void> put(K key, V value)

在 multimap 缓存中放置键值对。

MultimapCache<String, String> multimapCache = ...;

multimapCache.put("girlNames", "marie")
             .thenCompose(r1 -> multimapCache.put("girlNames", "oihana"))
             .thenCompose(r3 -> multimapCache.get("girlNames"))
             .thenAccept(names -> {
                          if(names.contains("marie"))
                              System.out.println("Marie is a girl name");

                           if(names.contains("oihana"))
                              System.out.println("Oihana is a girl name");
                        });
Copy to Clipboard Toggle word wrap

这个代码的输出如下:

Marie is a girl name
Oihana is a girl name
Copy to Clipboard Toggle word wrap

CompletableFuture<Collection<V>> get(K key)

异步返回与这个多映射缓存中键关联的值视图集合(若有)。对检索的集合的任何更改都不会更改这个 multimap 缓存中的值。当此方法返回空集合时,这意味着没有找到密钥。

CompletableFuture<Boolean> remove(K key)

异步从 multimap 缓存中删除与密钥关联的条目(如果存在)。

CompletableFuture<Boolean> remove(K key, V value)

异步从多映射缓存中删除键值对(如果存在)。

CompletableFuture<Void> remove(Predicate<? super V> p)

异步方法.删除与给定 predicate 匹配的每个值。

CompletableFuture<Boolean> containsKey(K key)

如果这个多映射包含该密钥,则异步返回为 true。

CompletableFuture<Boolean> containsValue(V value)

如果这个多映射包含至少一个键的值,则异步返回为 true。

CompletableFuture<Boolean> containsEntry(K key, V value)

如果这个多映射至少包含一个键值对及值,则返回 true。

CompletableFuture<Long> size()

异步返回多映射缓存中的键值对数量。它并不会返回不同的密钥数。

boolean supportsDuplicates()

如果多映射缓存支持重复,则异步返回为 true。这意味着 multimap 的内容可以是 'a' ['1', '1', '2']。现在,此方法总是返回 false,因为复制还没有支持。给定值的存在性是由 'equals' 和 'hashcode' 方法的合同决定。

12.1.3. 创建 Multimap 缓存

目前,MultimapCache 配置为常规缓存。这可以通过代码或 XML 配置完成。了解如何在配置 数据网格缓存中配置常规缓存

12.1.3.1. 嵌入式模式

// create or obtain your EmbeddedCacheManager
EmbeddedCacheManager cm = ... ;

// create or obtain a MultimapCacheManager passing the EmbeddedCacheManager
MultimapCacheManager multimapCacheManager = EmbeddedMultimapCacheManagerFactory.from(cm);

// define the configuration for the multimap cache
multimapCacheManager.defineConfiguration(multimapCacheName, c.build());

// get the multimap cache
multimapCache = multimapCacheManager.get(multimapCacheName);
Copy to Clipboard Toggle word wrap

12.1.4. 限制

几乎每个情况下,多映射缓存的行为是常规缓存,但当前版本中存在一些限制,如下所示:

12.1.4.1. 支持重复

副本尚不受支持。这意味着,多映射不包含任何重复的键值对。每当调用方法时,如果键-值对已存在,则不会添加此键-值对。用于检查键-值对的方法已在 multimap 中是否已存在 等于hashcode

12.1.4.2. 驱除

现在,驱除可以为每个键有效,而不是每个键值对运行。这意味着每当键被驱除时,与该密钥关联的所有值也会被驱除。

12.1.4.3. Transactions

隐式事务通过自动提交支持,所有方法都不是阻止的。在大多数情况下,显式事务可以正常发挥作用。阻塞 大小 的方法,包含Entryremove (Predicate<? super V> p)

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat