Apache Ignite:如何从命名缓存中获取所有项目

时间:2017-02-17 10:51:33

标签: apache ignite

我正在尝试从我的命名PARTITIONED缓存中获取所有项目。 Currenly我正在使用

  List<Cache.Entry<String, Object>> found =
        stmCache.query(new ScanQuery<String, Object>(
        new IgniteBiPredicate<String, Object>() {
           @Override
           public boolean apply(String key, Object person) {
              return true;
           }
        })).getAll();

这不是很好。可以使用:

    IgniteCompute compute = ignite.compute(); 

要做同样的事情还是其他任何建议?

3 个答案:

答案 0 :(得分:4)

试试cache.iterator() API:

Iterator<Cache.Entry<String, Object>> iter = cache.iterator();

答案 1 :(得分:0)

您可以广播在多个线程中的每个节点上运行本地ScanQueries的任务。

Smth喜欢:

ignite.compute(ignite.cluster().forDataNodes("myCache")).broadcast(
  -> {
     UUID locNode = ignite0.cluster().localNodeId();

     int[] parts = ignite0.affinity("myCache").primaryPartitions(locNode);

    Arrays.asList(parts).parallelStream().forEach(p -> {
       new ScanQuery().setLocal(true).setPartition(p).setFilter(...).getAll();
    })
  }
)

答案 2 :(得分:0)

您可以使用 JDK 1.8 中的 StreamSupportIterable 转换为 Stream

Stream<javax.cache.Cache.Entry<YourKey, YourValue>> stream =
    StreamSupport.stream(yourIgniteCache.spliterator(), false);

请注意,第二个参数确定生成的 Stream 应该是并行的还是顺序的。另外,请注意 Java 流不可重用,因此您可以将所有内容收集回映射,例如:

Map<YourKey, YourValue> reusableMap = 
     stream.collect(Collectors.toMap(Cache.Entry::getKey, Cache.Entry::getValue));