【发布时间】:2017-10-18 21:26:52
【问题描述】:
我使用 hazelcast 3.8.6。 有一个带有下一个设置的 IMAP{Key, Value}:
mapConfig.setBackupCount(5);
mapConfig.setReadBackupData(true);
关键是
long userId;
long contentId;
数据所在的节点也有 5 个。据我了解,根据设置,每个节点都将拥有所有数据。这样我将分布式地图转换为复制地图以提高获取操作的速度并且不进行网络调用。
让我们想象一下,我需要通过 id 获取用户的所有数据。在通常模式下,我会编写下一个代码:
EntryObject eo = new PredicateBuilder().getEntryObject();
Predicate predicate = eo.key().get("this.userId").equal(userId);
map.values(predicate).stream().map(.....)
此代码将在所有节点上执行,结果将返回给进行调用的节点。我是否正确理解,在设置“setReadBackupData(true)”的情况下,请求不会发送到其他节点,并且所有数据都将在发出此请求的节点上找到?或者在那种情况下,为了避免网络调用,我应该使用这样的东西:
map.entrySet().stream()
.filter(entry->entry.getKey().getUserId().equals(userId))
.map(.....)
谢谢。
【问题讨论】:
-
备份计数为 5 表示 6 个副本(master+5)。如果您只有 5 个节点,那么您请求的一份副本太多了。
-
而从备份中读取仅适用于基于密钥的访问,而不适用于查询。
-
entrySet()通常是有风险的,因为这就是一切,当IMap通常因为它很大而被分区时。你想解决什么问题?通过部分键查找所有键?你的map(....)对他们做了什么 -
noctarius,我是否正确理解您在“从备份读取”中如果我调用 map.entrySet(),数据将从该节点获取,因为它是基于键的访问?没有网络电话
-
你想解决什么问题?通过部分键找到一些键?您可以搜索密钥,因此
entrySet()可以是entrySet(predicate),这将减少电汇
标签: java spring hazelcast hazelcast-imap