在宝石火地区查找元素的最佳方式



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

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

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

请指教。

Vikas-

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

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

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

  1. 可以通过调用regionRegion获取 GemFire 的QueryServicegetRegionService().getQueryService(). 该QueryService允许您使用 OQL(或对象查询语言)编写 GemFire 查询。 有关更多详细信息,请参阅GemFire 的查询用户指南

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

例如。。。

SELECT * FROM /People p WHERE 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 查询可以参数化,参数可以传递给 Query.execute(args:Object[]) 方法,如上所示。 将适当的索引添加到您的 GemFireRegions中后,查询的性能可以大大提高。 请参阅有关创建索引的《宝石火》用户指南

  1. 最后,特别是对于 GemFirePARTITION Regions,您的Region数据被分区或"分片"并分布在集群中托管感兴趣Region的节点(GemFire 服务器)上(例如/People),然后您可以将查询与 GemFire 的函数执行服务相结合,在本地(到该节点)查询数据,其中数据实际存在(例如,包含数据子集的PARTITIONRegion的分片/存储桶),而不是将数据带给您。 您甚至可以将"验证"逻辑封装在您编写的 GemFireFunction中。

您需要将RegionFunctionContextPartitionRegionHelper一起使用,以获取要查询的Region的本地数据集。 阅读PartitionRegionHelper的Javadoc,因为它显示了您在这种情况下要查找的特定示例。

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

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

  2. 对于函数执行,您可以使用SD GemFire的函数执行注释支持。

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

您绝对应该熟悉 宝石火分区区域.

综上所述...

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

  1. 您首先如何组织数据(例如PARTITIONvs.REPLICATE,指的是Region's数据策略)。

  2. 您的验证逻辑如何适合向OQL查询谓词提供"条件",以便"SELECT"要验证的Region数据。 此外,通过应用适当的索引,可以进一步提高效率。

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

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

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

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

希望这有帮助!

问候 -John

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

还有其他方法可以快速验证入站数据是否是流式处理而不是客户端查找,例如函数服务。

最新更新