如何使用geode并行获取值?

时间:2017-07-31 13:48:15

标签: gemfire spring-data-gemfire geode

我们想执行region.getAll(keys)操作,以便并行处理这些值。此行为主要是为了强制缓存加载器并行加载值。从缓存加载器批量读取也可以工作,但我们不清楚如何向缓存加载器传达getAll()中存在的其他密钥。

这是最好在客户端处理的还是其他可以提供帮助的geode API?

1 个答案:

答案 0 :(得分:1)

Region.getAll(keys)是一个顺序操作,分别迭代所提供的Collection中的每个键,并从 Region 中获取值。如果您追踪Region.getAll(keys)的源代码,则最终会到达here

如果您的区域PARTITION 区域(强烈推荐),您可以利用Geode的并行功能执行,类似......

Region<?, ?> myPartitionRegion = ...
...

Set<KEY> keysOfInterests = ...
...

Execution functionExecution = FunctionService.onRegion(myPartitionRegion)
    .withFilter(keysOfInterests)
    .withArgs(...);

ResultCollector<?, ?> results = functionExecution.execute("myFunctionId");

// process the results.

然后你的功能实现......

class MyOnRegionFunction extends FunctionAdapter {

  public void execute(FunctionContext context) {

    assert context instanceOf RegionFunctionContext : 
      String.format("This Function [%s] must be executed on a Region", 
        getId());

    RegionFunctionContext regionContext = (RegionFunctionContext) context;

    Region<K, V> localData = 
      PartitionRegionHelper.getLocalDataForContext(regionContext);

    Map<K, V> results = localData.getAll(regionContext.getFilter());

    // do whatever with results; e.g. send back to caller...
  }
}

Filter上设置“Execution”,这是一组用于“路由”的键,功能执行到群集中的数据节点包含那些“键”,然后实际上,你(某种程度上)并行化getAll操作(好吧,只有那个节点上的键只是那个“上下文”中Filter的一部分,即{{3 }})。

可能有一个更好,更完整的例子this。请参阅“编写功能代码”部分。

您可能还应该阅读“ here ”和How Function Execution Works。还要注意这个......

  

应用程序需要对与密钥关联的数据执行操作。注册的服务器端功能可以检索数据,对其进行操作并将其放回,所有处理都在本地执行到服务器。

这是PARTITION Regions上的第一个项目符号。

您甚至可以将CacheLoader关联到“逻辑”PARTITION区域,并且当在函数内部进行提取并且数据不可用时,加载器将(应该)在本地操作到该节点无论如何它只会获取到该节点的KEYS(基于分区策略(默认情况下为“hash”))。

我没有尝试过后者,但我不明白为什么这不会起作用。

无论如何,希望这有帮助!

-John