我在GemFire中拥有大量记录的区域。
我需要在这些区域中查找元素以进行验证。我们扫描的每个项目都会进行查找;可以有超过10000个项目。
在Region中查找元素的有效方法是什么?
请建议。
答案 0 :(得分:1)
维卡斯 -
您可以通过多种方式查询或从GemFire Region中获取多个元素。
Region
间接实现了java.util.Map
,因此提供了所有基本的Map
操作,例如get(key):value,以及其他几项操作Map
getAll(Collection keys):Map中 尽管如此,
get(key):value
并不是最有效的"一次查找多个项目的方法,但getAll(..)
允许您为要返回的所有值传入Collection
个键。当然,您必须提前知道所需的所有值的键,所以...
QueryService
。getRegionService()
。getQueryService()
,从Region
获取GemFire的region
。 QueryService
允许您使用OQL(或对象查询语言)编写GemFire查询。有关详细信息,请参阅Querying上的 GemFire用户指南。使用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用户指南。
PARTITION Regions
,您的Region
数据已被分区,或者#34;分片&#34;并分布在托管感兴趣的Region
的群集中的节点(GemFire服务器)上(例如/People
),然后您可以将查询与GemFire的Function Execution服务结合起来进行查询数据实际存在于本地(到该节点)的数据(例如,包含数据子集的PARTITION
Region
的分片/桶),而不是将数据提供给您。你甚至可以封装&#34;验证&#34;您编写的GemFire Function
中的逻辑。您需要使用RegionFunctionContext
和PartitionRegionHelper
来获取要查询的Region
的本地数据集。阅读PartitionRegionHelper
的Javadoc,因为它显示了您在这种情况下寻找的特定示例。
Spring Data GemFire 可以解决许多这些问题......
对于查询,您可以使用SDG中提供的SD 存储库抽象和extension。
对于功能执行,您可以使用SD GemFire的Function ExeAnnotation支持。
但要小心,在Function上下文中使用SD Repository 抽象不仅仅是将查询限制为&#34; local&#34; PARTITION
Region
的数据集。 SD Repos始终处理&#34;逻辑&#34;的整个数据集。 Region
,其中数据必须在分区(分片)设置中跨群集中的节点分布。
你一定要熟悉GemFire Partitioned Regions。
在摘要 ...
中您选择的方法实际上取决于几个因素,例如但不限于:
您是如何组织数据的(例如PARTITION
与REPLICATE
相对应,Region's
DataPolicy。
您的验证逻辑如何提供&#34;标准&#34;比方说,OQL查询谓词来自&#34; SELECT
&#34; 仅您要验证的Region
数据。此外,通过应用适当的索引可以进一步提高效率。
群集中有多少个节点以及数据的分布情况,在这种情况下,Function
可能是最有利的方法...即将逻辑带入数据而不是数据到你的逻辑。后者涉及在数据所在的节点上选择匹配数据,这些数据可能涉及到包含数据的节点的多个网络跳数,具体取决于您的拓扑和配置(即&#34; 单跳访问& #34;等),将数据序列化以通过线路发送,从而增加网络上的饱和度,等等)。
根据您的UC,需要考虑的其他因素包括您的到期/逐出政策(例如,数据是否已溢出到磁盘),根据数据更改频率所需的验证频率等等。
大多数情况下,最好在路上验证数据并尽早发现错误。当然,随着数据的更新,您可能还需要执行后续验证,但这不能替代尽可能早期(尽可能)的验证。
有许多因素需要考虑,最佳方法并不总是很明显,因此请测试并确保您的优化和整体方法具有预期效果。
希望这有帮助!
此致 -John
答案 1 :(得分:0)
设置PDX序列化程序并使用查询服务获取元素。 “从/区域中选择元素,其中id = xxx”。这将返回您的元素字段,而不反序列化记录。确保id已编入索引。
如果您的入站数据是流式传输而不是客户端查找,还有其他方法可以快速验证,例如功能服务。