HazelCast IMap 为什么在更新地图值时需要 EntryProcessor 因为它是分布式地图(单实例场景)?

HazelCast IMap why EntryProcessor required when updating map values since its a distributed map(single instance scenario)?

我将 Hazelcast 用于分布式缓存(只有一个实例)。在一次场景中,我试图更新地图中的值。 基于 看来我在进行更新操作时必须使用 EntryProcessor 因为它是原子的。

public class AnalysisResponseProcessor implements EntryProcessor<String, AnalysisResponseMapper> {

    @Override
    public Object process(Map.Entry<String, AnalysisResponseMapper> entry) {
        AnalysisResponseMapper analysisResponseMapper = entry.getValue();
        analysisResponseMapper.increaseCount();
        entry.setValue(analysisResponseMapper);
        return analysisResponseMapper;
    }

    @Override
    public EntryBackupProcessor<String, AnalysisResponseMapper> getBackupProcessor() {
        return null;
    }
}

如何处理这种情况?

您问题的答案:

  • 无论地图是否分布式,都可以并发访问。如果你做了一系列getput,其他人可以同时修改该值,你将覆盖更新。如果使用 EntryProcessor,则可以在一个原子操作中读取和更新值。如果只有一个客户端更新地图,您可以使用 getput。入口处理器也需要一次网络往返而不是两次。

  • 如果您有 0 个备份,您可以 return null 作为备份处理器。但是,如果您决定添加备份,则备份将不会更新。在不必处理备份处理器的地方扩展 AbstractEntryProcessor 可能更容易,它将在主副本和备份副本上执行相同的逻辑。只有在 process 方法中的计算量很大时才值得手动执行备份处理器。

  • 来自 process() 方法的 return 值不是更新的条目值,而是将从 map.executeOnKey() 编辑的值 return ] 方法。不需要的话就returnnull.