Hazelcast Delta更新

时间:2019-05-20 10:30:13

标签: java hazelcast hazelcast-imap

我正在寻找某种方法在hazelcast中对大量数据(超过100万条记录)进行增量更新

用例是为对象映射提供了hazelcast客户端,该映射的值内仅填充了某些字段,其余字段为null。 如果要更改条目的字段,但是如果它们为null或相同,则我们希望替换它们。

我们目前使用入口处理器来执行此操作,但我相信我们传入构造函数的Map将发送到效率低下的集群的每个成员。 有更好的方法吗?

private Map mapOfNewValues;

public DomainClassDeltaUpdateEntryProcessor(Map mapOfNewValues) {
  this.mapOfNewValues = mapOfNewValues;
}

@Override
public Object process(Map.Entry<String, DomainClass> entry) {
  DomainClass oldDomain = entry.getValue();
  if (oldDomain != null) {
    DomainClass newDomainObj = (DomainClass) map.get(entry.getKey());
    if (newDomainObj != null) {
      entry.setValue(getDelta(oldDomain,newDomainObj));
    }
  }
  return null;
}

使用

调用
 map.executeOnKeys(deltaMap.keySet(), new DomainClassDeltaUpdateEntryProcessor(deltaMap));

1 个答案:

答案 0 :(得分:0)

您可以在客户端查看并使用executeOnKey。这样,您可以通过一个单独的调用发送每个ket的更新,因此,如果您在地图和4个成员中有1000个密钥,而不是将全部1000个更新发送给所有4个成员,则仅发送在4个成员之间分配的100个更新调用将仅包含1个增量对象。

因此,在客户端,您可以执行以下操作:

mapOfNewValues.entrySet().forEach(e -> if(e.getValue() != null) map.executeOnKey(e.getKey(), new DomainClassDeltaUpdateEntryProcessor(e.getValue())));