在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如果连接到数据库(例如),将从该数据库(从
    IMap\clear()
    javadoc)中删除记录。这是清除
    IMap
  • :从该地图中移出除锁定的关键点以外的所有关键点。如果为此
    IMap
    定义了,则此方法不会调用
    IMap#deleteAll()
    (从
    IMap#execall()
    javadoc)
  • 使用任何
    map.keySet().forEach(…)变体,地图中所有键的克隆由
    键集返回
    ,从而增加内存压力
最后一句话,您在同一JVM中使用2
HazelcastInstance
s进行简单测试所观察到的情况,可能与在两个不同主机上使用2
HazelcastInstance
s进行的实际部署大不相同


谢谢Vassilis,我同意你的看法,在spring上下文中尝试清除()并设置后意识到。CPU使用情况的图片在哪里?还有,有什么问题吗?