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

在GemFire区域中查找元素的最佳方法,gemfire,spring-data-gemfire,Gemfire,Spring Data Gemfire,我在GemFire有很多记录 我需要查找这些区域中的元素以进行验证。我们扫描的每个项目都会进行查找;可以有超过10000个项目 在区域中查找元素的有效方法是什么 请推荐。Vikas- 有几种方法可以查找或从GemFire中获取多个元素 如您所见,GemFire区域间接实现了java.util.Map,因此提供了所有基本的映射操作,例如,除了在Map-like中不可用的其他一些操作之外。 尽管如此,getkey:value并不是一次查找多个项的最有效方法,但是getAll。。允许您为要返回的所有值

我在GemFire有很多记录

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

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

请推荐。

Vikas-

有几种方法可以查找或从GemFire中获取多个元素

如您所见,GemFire区域间接实现了java.util.Map,因此提供了所有基本的映射操作,例如,除了在Map-like中不可用的其他一些操作之外。 尽管如此,getkey:value并不是一次查找多个项的最有效方法,但是getAll。。允许您为要返回的所有值传入一组键。当然,你必须事先知道你想要的所有值的键,所以

您可以通过调用Region。。。允许您使用OQL或对象查询语言编写GemFire查询。有关更多详细信息,请参阅上的GemFire用户指南。 与getAllkeys相比,使用OQL的优点当然是,您不需要知道可能需要预先验证的所有值的键。如果验证逻辑基于与需要评估的值相匹配的某些条件,则可以在OQL查询谓词中表示此条件

例如

选择*FROM/People p,其中p.age>=21

要调用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查询可以参数化,参数可以传递给方法,如上所示。将适当的索引添加到GemFire区域后,查询的性能将显著提高。请参阅上的GemFire用户指南

最后,特别是使用GemFire分区区域,当您的区域数据被分区,或分片并分布在集群中承载感兴趣区域(例如/人)的GemFire服务器节点上时,您可以将查询与GemFire的服务结合起来,以本地查询该节点的数据,数据实际存在的位置,例如分区区域的碎片/存储桶包含数据的子集,而不是将数据带给您。您甚至可以在编写的GemFire函数中封装验证逻辑。 您需要使用RegionFunctionContext和获取要查询的区域的本地数据集。阅读PartitionRegionHelper的Javadoc,因为它显示了您在本例中寻找的特定示例

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

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

对于函数执行,可以使用SD GemFire的支持

不过要小心,在函数上下文中使用SD存储库抽象并不仅仅是将查询限制在分区区域的本地数据集。SD REPO始终在逻辑区域的整个数据集上工作,其中数据必须在分区分片设置中分布在集群中的节点上

你一定要熟悉GemFire

总之

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

您首先是如何组织数据的,例如分区与复制,这是指区域的

您的验证逻辑是否适合向(例如)OQL查询谓词提供条件,以便仅选择要验证的区域数据。此外,通过应用适当的索引,可以进一步提高效率

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

取决于您的UC,考虑的其他因素是您的过期/驱逐策略,例如数据是否已溢出到磁盘,基于数据变化的频繁需要的验证频率等。

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

<> P>有很多因素要考虑,最优方法并不总是明显的,所以测试并确保你的优化和整体方法具有预期的效果。 希望 这很有帮助

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

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