我需要从Hazelcast分布式地图中删除一个项目,我使用类似这样的代码(简化):
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();
}
}
}
但是这段代码没有删除值,地图的大小在开头时与末尾的大小相同。
当我看到Hazelcast Javadoc时,我看到此界面仅定义了按键和键的值删除。这是否意味着我不能使用标准方法如何从地图中删除值?
答案 0 :(得分:10)
从地图中删除您无法通过迭代器执行的项目。迭代器是入口集的临时副本,对它的更改不会反映到地图的内容。
你的方法不是很可扩展,因为你迭代地图中的所有条目,想象你有数千兆字节的地图条目..大约50%需要在找到你的项目之前通过线路发送。
如果要删除项目,可以执行以下操作:
map.remove(somekey)
但最大的问题是:你如何找到你的物品。在你的情况下你的项目显然有某种server.id,所以你可以在该id上创建一个索引,这样你就可以快速查找,并将其与:
结合使用IMap.executeOnEntries(EntryProcessor entryProcessor, Predicate predicate);
当您创建谓词(找到您的条目)并创建一个条目处理器(可以删除您的条目)时,您可以进行更有效的删除。