在GemFire Region中查找元素的最佳方法

时间:2017-07-27 14:25:25

标签: gemfire spring-data-gemfire

我在GemFire中拥有大量记录的区域。

我需要在这些区域中查找元素以进行验证。我们扫描的每个项目都会进行查找;可以有超过10000个项目。

在Region中查找元素的有效方法是什么?

请建议。

2 个答案:

答案 0 :(得分:1)

维卡斯 -

您可以通过多种方式查询或从GemFire Region中获取多个元素。

  1. 正如您所看到的,GemFire Region间接实现了java.util.Map,因此提供了所有基本的Map操作,例如get(key):value,以及其他几项操作Map getAll(Collection keys):Map
  2.   

    尽管如此,get(key):value并不是最有效的"一次查找多个项目的方法,但getAll(..)允许您为要返回的所有值传入Collection个键。当然,您必须提前知道所需的所有值的键,所以...

    1. 您可以致电QueryServicegetRegionService()getQueryService(),从Region获取GemFire的regionQueryService允许您使用OQL(或对象查询语言)编写GemFire查询。有关详细信息,请参阅Querying上的 GemFire用户指南
    2.   

      使用OQL优于getAll(keys)的优势当然是,您无需了解预先验证可能需要的所有值的键。如果验证逻辑基于某些与需要评估的值匹配的条件,则可以在OQL查询谓词中表达此条件。

      例如......

      SELECT * FROM /People p WHERE p.age >= 21;

      要求GemFire QueryService撰写上述查询,您会......

      Region people = cache.getRegion("/People");
      
      ...
      
      QueryService queryService = people.getRegionSevice().getQueryService();
      
      Query query = queryService.newQuery("SELECT * FROM /People p WHERE p.age >= $1");
      
      SelectResults<Person> results = (SelectResults<Person>) query.execute(asArray(21));
      
      // process (e.g. validate) the results
      
        

      可以参数化OQL查询,并将参数传递给Query.execute(args:Object[])方法,如上所示。将适当的索引添加到GemFire Regions后,查询的性能可以显着提高。请参阅creating Indexes上的 GemFire用户指南

      1. 最后,特别是使用GemFire PARTITION Regions,您的Region数据已被分区,或者#34;分片&#34;并分布在托管感兴趣的Region的群集中的节点(GemFire服务器)上(例如/People),然后您可以将查询与GemFire的Function Execution服务结合起来进行查询数据实际存在于本地(到该节点)的数据(例如,包含数据子集的PARTITION Region的分片/桶),而不是将数据提供给您。你甚至可以封装&#34;验证&#34;您编写的GemFire Function中的逻辑。
      2. 您需要使用RegionFunctionContextPartitionRegionHelper来获取要查询的Region的本地数据集。阅读PartitionRegionHelper的Javadoc,因为它显示了您在这种情况下寻找的特定示例。

        Spring Data GemFire 可以解决许多这些问题......

        1. 对于查询,您可以使用SDG中提供的SD 存储库抽象extension

        2. 对于功能执行,您可以使用SD GemFire的Function ExeAnnotation支持。

        3. 但要小心,在Function上下文中使用SD Repository 抽象不仅仅是将查询限制为&#34; local&#34; PARTITION Region的数据集。 SD Repos始终处理&#34;逻辑&#34;的整个数据集。 Region,其中数据必须在分区(分片)设置中跨群集中的节点分布。

          你一定要熟悉GemFire Partitioned Regions

          摘要 ...

          您选择的方法实际上取决于几个因素,例如但不限于:

          1. 您是如何组织数据的(例如PARTITIONREPLICATE相对应,Region's DataPolicy

          2. 您的验证逻辑如何提供&#34;标准&#34;比方说,OQL查询谓词来自&#34; SELECT&#34; 您要验证的Region数据。此外,通过应用适当的索引可以进一步提高效率。

          3. 群集中有多少个节点以及数据的分布情况,在这种情况下,Function可能是最有利的方法...即将逻辑带入数据而不是数据到你的逻辑。后者涉及在数据所在的节点上选择匹配数据,这些数据可能涉及到包含数据的节点的多个网络跳数,具体取决于您的拓扑和配置(即&#34; 单跳访问& #34;等),将数据序列化以通过线路发送,从而增加网络上的饱和度,等等)。

          4. 根据您的UC,需要考虑的其他因素包括您的到期/逐出政策(例如,数据是否已溢出到磁盘),根据数据更改频率所需的验证频率等等。

          5. 大多数情况下,最好在路上验证数据并尽早发现错误。当然,随着数据的更新,您可能还需要执行后续验证,但这不能替代尽可能早期(尽可能)的验证。

            有许多因素需要考虑,最佳方法并不总是很明显,因此请测试并确保您的优化和整体方法具有预期效果。

            希望这有帮助!

            此致 -John

答案 1 :(得分:0)

设置PDX序​​列化程序并使用查询服务获取元素。 “从/区域中选择元素,其中id = xxx”。这将返回您的元素字段,而不反序列化记录。确保id已编入索引。

如果您的入站数据是流式传输而不是客户端查找,还有其他方法可以快速验证,例如功能服务。

相关问题