我需要从 Hazelcast 分布式 map 中删除一个项目,我使用类似以下代码(简化):
public void realeaseBatchesById(int Id) {
Iterator<Map.Entry<Long, WorkingBatch>> it = workingMap.entrySet().iterator();
while (it.hasNext()) {
WorkingBatch value = it.next().getValue();
if (value.getServer().getId() == idd) {
it.remove();
}
}
}
但是这段代码并没有删除值, map 的大小在开始的时候和结束的时候是一样的。
当我看到 Hazelcast Javadoc我看到这个接口(interface)只定义了按键删除和按键删除值。这是否意味着我不能使用标准方法从 map 中删除值?
最佳答案
从 map 中删除您不能通过迭代器执行的项目。迭代器是条目集的临时副本,对其的更改不会反射(reflect)在 map 的内容上。
你的方法不是很可扩展,因为你遍历了 map 中的所有条目,假设你有千兆字节的 map 条目..在找到你的项目之前,大约 50% 需要通过线路发送。
如果你想删除一个项目,你可以这样做:
map.remove(somekey)
但最大的问题是:您如何找到您的元素。在你的情况下,你的项目显然有某种 server.id,所以你可以在那个 id 上创建一个索引,这样你就可以进行快速查找,并将它与:
IMap.executeOnEntries(EntryProcessor entryProcessor, Predicate predicate);
当您创建一个谓词(找到您的条目)并创建一个条目处理器(可以删除您的条目)时,您可以进行更高效的删除。
关于java - 从 Hazelcast map 中删除元素的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21992685/