Hazelcast中的MultiMap
是一個(gè)key可以有多個(gè)值的特殊map。和其他數(shù)據(jù)結(jié)構(gòu)一樣募胃,MultiMap
也是分布式和線程安全的。MultiMap
不是 java.util.Map
的分布式實(shí)現(xiàn)末誓,MultiMap
支持Map的多數(shù)功能拷恨,但是不支持索引,謂詞和加載/存儲(chǔ)。MultiMap
的數(shù)據(jù)最終也會(huì)均勻分布于集群所有節(jié)點(diǎn)蟀俊,新節(jié)點(diǎn)加入時(shí)的處理邏輯和map一樣钦铺。
1. 基本操作
創(chuàng)建MultiMap
并存儲(chǔ)數(shù)據(jù):
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
MultiMap<String, Integer> multiMap = instance.getMultiMap("data");
multiMap.put("even", 2);
multiMap.put("even", 4);
multiMap.put("odd", 5);
遍歷元素:
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
MultiMap<String, Integer> multiMap = instance.getMultiMap("data");
multiMap.put("even", 2);
multiMap.put("even", 4);
multiMap.put("odd", 5);
multiMap.keySet().forEach(s -> System.out.println(String.format("key = %s,value = %s", s, multiMap.get(s).toString())));
輸出如下:
key = even,value = [4, 2]
key = odd,value = [5]
MultiMap 支持通過(guò) EntryListener
監(jiān)聽(tīng)數(shù)據(jù)變化。
2. 配置
在使用MultiMap時(shí)肢预,可以通過(guò) valueCollectionType
配置值的集合類(lèi)型是Set或List矛洞。如果選擇Set 重復(fù)值和空置是不允許的而且順序是無(wú)關(guān)緊要的。如果選擇使用List 排序是相關(guān)的而且可以允許存儲(chǔ)重復(fù)的值烫映。通過(guò)statisticsEnabled
配置可以開(kāi)啟對(duì)MultiMap的統(tǒng)計(jì)缚甩,使用 getLocalMultiMapStats()
方法獲取統(tǒng)計(jì)信息。
目前窑邦,MultiMap不支持?jǐn)?shù)據(jù)驅(qū)逐擅威。
下面是MultiMap的配置樣例。
聲明式配置:
<hazelcast>
...
<multimap name="default">
<backup-count>0</backup-count>
<async-backup-count>1</async-backup-count>
<value-collection-type>SET</value-collection-type>
<entry-listeners>
<entry-listener include-value="false" local="false" >com.hazelcast.examples.EntryListener</entry-listener>
</entry-listeners>
<split-brain-protection-ref>split-brain-protection-name</split-brain-protection-ref>
</multimap>
...
</hazelcast>
代碼配置:
MultiMapConfig mmConfig = new MultiMapConfig();
mmConfig.setName( "default" )
.setBackupCount( 0 ).setAsyncBackupCount( 1 )
.setValueCollectionType( "SET" )
.setSplitBrainProtectionName( "splitbrainprotectionname" );
配置參數(shù)及其含義:
-
backup-count
: 同步備份數(shù)冈钦。 -
async-backup-count
: 異步備份數(shù)郊丛。 -
statistics-enabled
: 是否開(kāi)啟統(tǒng)計(jì)。 -
value-collection-type
: 存儲(chǔ)值的集合類(lèi)型SET
或LIST
瞧筛。 -
entry-listeners
: 監(jiān)聽(tīng)器. -
split-brain-protection-ref
: 腦裂保護(hù)厉熟。
3. 腦裂保護(hù)
MultiMap 和 TransactionalMultiMap 支持配置在應(yīng)用操作前檢查集群可用節(jié)點(diǎn)數(shù)。在網(wǎng)絡(luò)分區(qū)的情況下较幌,該配置可以避免操作在所有集群(一個(gè)集群分為多個(gè))都執(zhí)行成功揍瑟。
下面是支持腦裂保護(hù)的方法。
MultiMap:
- WRITE, READ_WRITE:
clear
forceUnlock
lock
put
remove
tryLock
unlock
- READ, READ_WRITE:
containsEntry
containsKey
containsValue
entrySet
get
isLocked
keySet
localKeySet
size
valueCount
values
TransactionalMultiMap:
- WRITE, READ_WRITE:
put
remove
- READ, READ_WRITE:
size
get
valueCount
配置腦裂保護(hù)
通過(guò)setSplitBrainProtectionName()
方法或者 split-brain-protection-ref
元素配置腦裂保護(hù)乍炉。下面是一個(gè)聲明式配置樣例:
<hazelcast>
...
<multimap name="default">
<split-brain-protection-ref>splitbrainprotection-name</split-brain-protection-ref>
</multimap>
...
</hazelcast>