提问者:小点点

在GemFire区域中查找元素的最佳方式


我在GemFire有大量记录的地区。

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

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

请建议。


共2个答案

匿名用户

维卡斯-

您可以通过多种方式从GemFire区域查找或获取多个元素。

  1. 如您所见,GemFireRegion间接实现了java.util.Map,因此提供了所有基本的Map操作,例如get(key): value,以及Map中不可用的其他几个操作,例如getAll(Collection key):Map。

虽然,get(key): value不会是一次查找多个项目的最“有效”的方法,但是getAll(…)允许您传入您想要返回的所有值的键集合。当然,您必须事先知道所有想要的值的键,所以….

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

比如说…

SELECT*from /Peoplep WHERE p. age

要调用GemFireQueryService编写上面的查询,您将…

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.执行(args: Object[])方法。当将适当的索引添加到您的GemFire区域时,您的查询的性能可以显着提高。请参阅有关创建索引的GemFire用户指南。

您将需要使用Region onFunctionContextParttionRegion onHelper来获取要查询的区域的本地数据集。阅读的Javadoc,因为它显示了您在本例中要查找的特定示例。

Spring Data GemFire可以帮助解决其中许多问题……

>

  • 对于查询,您可以使用SDG中提供的SD存储库抽象和扩展。

    对于函数执行,您可以使用SD的Function ExeAnnotion支持。

    但是要小心,在Function上下文中使用SD存储库抽象不仅仅会将查询限制在PARTITIONRegion的“本地”数据集上。SDRepos始终适用于“逻辑”Region的整个数据集,其中数据必须分布在分区(分片)设置中集群中的节点上。

    您绝对应该熟悉GemFire分区区域。

    综上所述…

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

    >

  • 首先如何组织数据(例如PARTITIONREPLICATE,它指的是Region的DataPolicy)。

    验证逻辑是如何将“条件”提供给(例如)OQL查询谓词以“SELECT”仅提供给您要验证的Region数据的。此外,通过应用适当的索引,效率可能会进一步提高。

    集群中有多少节点以及您的数据是如何分布的,在这种情况下,Function可能是最有利的方法…即将逻辑带到您的数据中,而不是将数据带到您的逻辑中。后者涉及选择数据所在节点上的匹配数据,这可能涉及到根据您的拓扑和配置(即“单跳访问”等)到包含数据的节点的几个网络跃点,序列化数据以通过线路发送,从而增加网络上的饱和度,等等)。

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

    大多数情况下,最好在进入过程中验证数据并尽早捕获错误。自然,随着数据的更新,您可能还需要执行后续验证,但这并不能替代尽可能早(尽可能)的验证。

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

    希望这有帮助!

    -你好-约翰

  • 匿名用户

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

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