HazelCast IMap 为什么在更新地图值时需要 EntryProcessor 因为它是分布式地图(单实例场景)?
HazelCast IMap why EntryProcessor required when updating map values since its a distributed map(single instance scenario)?
我将 Hazelcast 用于分布式缓存(只有一个实例)。在一次场景中,我试图更新地图中的值。
基于 看来我在进行更新操作时必须使用 EntryProcessor
因为它是原子的。
- 为什么我必须使用
EntryProcessor
,即使 IMap
已分发?
- 在 Entry 处理器代码中,从技术上讲,我无法从分发后的文档中准确理解 BackupProcessor 的用法。
- 为什么 process 方法 returns 一个 Object 而它没有效果(我们必须将更新值设置为
Map.entry.setValue()
才能实际更新)。
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;
}
}
如何处理这种情况?
您问题的答案:
无论地图是否分布式,都可以并发访问。如果你做了一系列get
和put
,其他人可以同时修改该值,你将覆盖更新。如果使用 EntryProcessor
,则可以在一个原子操作中读取和更新值。如果只有一个客户端更新地图,您可以使用 get
和 put
。入口处理器也需要一次网络往返而不是两次。
如果您有 0 个备份,您可以 return null
作为备份处理器。但是,如果您决定添加备份,则备份将不会更新。在不必处理备份处理器的地方扩展 AbstractEntryProcessor
可能更容易,它将在主副本和备份副本上执行相同的逻辑。只有在 process
方法中的计算量很大时才值得手动执行备份处理器。
来自 process()
方法的 return 值不是更新的条目值,而是将从 map.executeOnKey()
编辑的值 return ] 方法。不需要的话就returnnull
.
我将 Hazelcast 用于分布式缓存(只有一个实例)。在一次场景中,我试图更新地图中的值。
基于 看来我在进行更新操作时必须使用 EntryProcessor
因为它是原子的。
- 为什么我必须使用
EntryProcessor
,即使IMap
已分发? - 在 Entry 处理器代码中,从技术上讲,我无法从分发后的文档中准确理解 BackupProcessor 的用法。
- 为什么 process 方法 returns 一个 Object 而它没有效果(我们必须将更新值设置为
Map.entry.setValue()
才能实际更新)。
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;
}
}
如何处理这种情况?
您问题的答案:
无论地图是否分布式,都可以并发访问。如果你做了一系列
get
和put
,其他人可以同时修改该值,你将覆盖更新。如果使用EntryProcessor
,则可以在一个原子操作中读取和更新值。如果只有一个客户端更新地图,您可以使用get
和put
。入口处理器也需要一次网络往返而不是两次。如果您有 0 个备份,您可以 return
null
作为备份处理器。但是,如果您决定添加备份,则备份将不会更新。在不必处理备份处理器的地方扩展AbstractEntryProcessor
可能更容易,它将在主副本和备份副本上执行相同的逻辑。只有在process
方法中的计算量很大时才值得手动执行备份处理器。来自
process()
方法的 return 值不是更新的条目值,而是将从map.executeOnKey()
编辑的值 return ] 方法。不需要的话就returnnull
.