在hazelcast IMap上使用clear/deleteAll的更好方法
使用的示例代码:在hazelcast IMap上使用clear/deleteAll的更好方法,hazelcast,Hazelcast,使用的示例代码: public static void main(String[] args) { HazelcastInstance hz = Hazelcast.newHazelcastInstance(); HazelcastInstance hz1 = Hazelcast.newHazelcastInstance(); IMap<String, String> map = hz.
public static void main(String[] args) {
HazelcastInstance hz = Hazelcast.newHazelcastInstance();
HazelcastInstance hz1 = Hazelcast.newHazelcastInstance();
IMap<String, String> map = hz.getMap("map");
for(int i=0; i < 1000000 ; i++) {
String key = "key" +Integer.toString(i);
String value = "value"+Integer.toString(i);
map.setAsync(key,value);
}
System.out.println("Completed loading to Imap");
long timeStarted = System.currentTimeMillis();
//map.clear()
//map.evictAll()
//map.keySet().forEach(key -> map.delete(key));
map.keySet().forEach(key -> map.removeAsync(key));
long timeComplted = System.currentTimeMillis();
System.out.println("time took using clear::"+(timeComplted - timeStarted));
}
publicstaticvoidmain(字符串[]args){
HazelcastInstance hz=Hazelcast.newHazelcastInstance();
HazelcastInstance hz1=Hazelcast.newHazelcastInstance();
IMap map=hz.getMap(“map”);
对于(int i=0;i<1000000;i++){
字符串key=“key”+整数.toString(i);
String value=“value”+Integer.toString(i);
setAsync(键,值);
}
System.out.println(“已完成加载到Imap”);
long timeStarted=System.currentTimeMillis();
//map.clear()
//map.executeAll()
//map.keySet().forEach(key->map.delete(key));
map.keySet().forEach(key->map.removesync(key));
long-timeComplted=System.currentTimeMillis();
println(“使用clear::”+(timeComplted-timeStarted)所花费的时间);
}
清除():
已完成加载到Imap
使用clear::302花费的时间
CPU消耗过高(超过200%)
ecictAll():
已完成加载到Imap
使用clear::511所花费的时间
CPU消耗过高(超过200%)
使用每个键删除:
已完成加载到Imap
使用clear::81578花费的时间
CPU消耗高(超过200%)
使用asyncRemove删除:
已完成加载到Imap
使用clear::9818所花费的时间
CPU消耗高(超过200%)
注意:另一件事是,如果缓存中有1000万个条目,那么在我的本地缓存中,上面的任何一项都不起作用。
{clear()/execall()/delete by key}花费了很长时间,最后由于内存不足而失败。
下图是试图从映射中删除1000万个条目时的CPU使用情况。您的测试不仅仅是测量执行所用的时间(或您测试的其他方法):而是测量在同时执行其他几个
setAsync
操作时所用的时间。这就是为什么你会看到高CPU使用率;这不是因为clear
占用大量CPU,而是因为仍有异步操作排队并同时执行。您的紧密循环正在用异步操作淹没Hazelcast,并且您尚未配置任何背压。在没有配置背压的情况下(请参阅),Hazelcast将只接受任意数量的传入异步操作,您可以通过向其发送请求来触发OutOfMemoryException
。为了更好地观察您尝试过的4种方法中的每一种,最好在循环中使用set
而不是setAsync
,这样可以确保您的映射完全填充,并且在清除映射时不会发生进一步的操作
此外,您在上面尝试的4种方法具有完全不同的语义:
- :清除映射并调用实现的MapStore,该MapStore如果连接到数据库(例如),将从该数据库(从
javadoc)中删除记录。这是清除IMap\clear()
IMap
- :从该地图中移出除锁定的关键点以外的所有关键点。如果为此
定义了,则此方法不会调用IMap
(从IMap#deleteAll()
javadoc)IMap#execall()
- 使用任何
map.keySet().forEach(…)代码>变体,地图中所有键的克隆由
,从而增加内存压力键集返回
HazelcastInstance
s进行简单测试所观察到的情况,可能与在两个不同主机上使用2HazelcastInstance
s进行的实际部署大不相同
谢谢Vassilis,我同意你的看法,在spring上下文中尝试清除()并设置后意识到。CPU使用情况的图片在哪里?还有,有什么问题吗?