我正在寻找某种方法在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));
答案 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())));