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

HazelCast IMap为什么在更新映射值时需要EntryProcessor,因为它是分布式映射(单实例场景)?,hazelcast,Hazelcast,我将Hazelcast用于分布式缓存(只有一个实例)。在once场景中,我尝试更新映射中的值。 基于这一点,我似乎必须在执行更新操作时使用EntryProcessor,因为它是原子级的 为什么即使分发了IMap也必须使用EntryProcessor 在Entry processor代码中,由于BackupProcessor是分布式的,所以从技术上讲,我不能完全从文档中了解BackupProcessor的用法 为什么process方法返回一个对象而它没有效果(我们必须将更新的值设置为Map.en

我将Hazelcast用于分布式缓存(只有一个实例)。在once场景中,我尝试更新映射中的值。 基于这一点,我似乎必须在执行更新操作时使用
EntryProcessor
,因为它是原子级的

  • 为什么即使分发了
    IMap
    也必须使用
    EntryProcessor
  • 在Entry processor代码中,由于BackupProcessor是分布式的,所以从技术上讲,我不能完全从文档中了解BackupProcessor的用法
  • 为什么process方法返回一个对象而它没有效果(我们必须将更新的值设置为
    Map.entry.setValue()
    才能实际更新)
公共类AnalysisResponseProcessor实现EntryProcessor{
@凌驾
公共对象进程(Map.Entry){
AnalysisResponseMapper AnalysisResponseMapper=entry.getValue();
analysisResponseMapper.increaseCount();
entry.setValue(analysisResponseMapper);
返回分析应答器;
}
@凌驾
public EntryBackupProcessor getBackupProcessor(){
返回null;
}
}

如何处理这种情况?

回答您的问题:

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

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

  • process()
    方法的返回值不是更新的条目值,而是将从
    map.executeOnKey()
    方法返回的值。如果您不需要它,只需返回
    null

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;
    }
}