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