更好的方法在hazelcast IMap上使用clear/deleteAll

cha*_*nya 1 clear hazelcast

使用的示例代码:

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));
}
Run Code Online (Sandbox Code Playgroud)

Clear():完成加载到Imap时间使用clear :: 302 CPU消耗过高(200%以上)

ecictAll():完成加载到Imap时使用clear :: 511 CPU消耗过高(200%以上)

使用每个键删除:完成加载到Imap时间使用clear :: 81578 CPU消耗很高(超过200%)

使用asyncRemove删除:已完成加载到Imap时使用clear :: 9818 CPU消耗很高(超过200%)

注意:另一件事是如果缓存有1000万个条目,那么以上都不适用于我的本地.{clear()/ evictAll()/ delete by key}花了很长时间,最后因内存不足而失败.下图是尝试从地图中删除1000万条目时的CPU使用率.

小智 6

无法进行测试测量来进行拍摄只是时间setAsync(或你测试的其他方法):更确切地说,它是测量多少时间clear了,而执行在同一时间其他几个OutOfMemoryException行动是最有可能仍在执行.这就是你看到高CPU使用率的原因; 这不是因为setCPU密集型,而是因为仍有异步操作排队并同时执行.你的紧密循环充斥着Hazelcast的异步操作,而你没有配置任何背压.如果没有配置背压(参见[1]),Hazelcast将只接受任意数量的传入异步操作,您可以setAsync通过充满请求来满足它.为了更好地观察您尝试的4种方法中的每种方法,最好使用IMap#clear()而不是evictAll在循环中,这样可以保证地图完全填充,并且在清除地图时不会发生进一步的操作.

此外,您在上面尝试的4种方法具有完全不同的语义:

  • IMap:清除地图并在MapStore上调用{@link MapStore#deleteAll} deleteAll,如果连接到数据库,将删除该数据库中的记录.(来自IMapjavadoc).这(或IMap#deleteAll())是清除的首选方法IMap#evictAll()
  • map.keySet().forEach(...);:驱逐此地图中的所有键,但锁定的键除外.如果为此映射定义了MapStor},则此方法不会调用deleteAll.(来自keySetjavadoc).
  • 对于任何HazelcastInstance变体,通过HazelcastInstance增加内存压力返回映射中所有键的克隆.

最后一句话,您setAsync在同一JVM中使用2 s进行简单测试时观察到的结果可能与2 clear个不同主机上2 s 的实际部署完全不同.

[1] http://docs.hazelcast.org/docs/3.9/manual/html-single/index.html#back-pressure