2017-07-27 57 views
0

我在GemFire中有大量記錄的區域。在GemFire區域查找元素的最佳方式

我需要在這些區域中查找元素以進行驗證。查找正在發生,我們掃描每個項目;可以有超過10000個項目。

在區域中查找元素的有效方法是什麼?

請建議。

回答

1

Vikas-

有幾種方法,使您可以從一個的GemFire Region查詢或取多個元素。

  1. 正如你所看到的,一個的GemFire Region間接實現java.util.Map,因此提供了所有的基本Map操作,如get(key):value,除了那些提供MapgetAll(Collection keys):Map其他幾個操作。

雖然,get(key):value不會成爲一次查找多個項目中最「有效」的方法,但getAll(..)讓你在關鍵的Collection通爲要返回的所有值。當然,你必須知道你在想提前值的鍵,所以...

  • 您可以獲取的GemFire的QueryServiceRegion通過調用regiongetRegionService()getQueryService()QueryService允許您使用OQL編寫GemFire查詢(或對象查詢語言)。有關更多詳細信息,請參閱GemFire的用戶指南Querying
  • 使用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用戶指南

  • 最後,具有的GemFire PARTITION Regions尤其,在您Region數據劃分,或「分片」和分佈在集羣中的該主機的Region節點(的GemFire服務器) (例如/People),那麼您可以將查詢與GemFire的Function Execution服務相結合來查詢數據實際存在的本地(到該節點)的數據(例如,包含數據子集的分片/桶的數據),而不是而不是把數據帶給你。您甚至可以在您編寫的GemFire Function中封裝「驗證」邏輯。
  • 您將需要使用RegionFunctionContextPartitionRegionHelper一起獲取本地數據集Region的查詢。閱讀PartitionRegionHelper的Javadoc,因爲它顯示了您在這種情況下尋找的特定示例。

    春數據的GemFire可以用很多的這些問題幫助...

    1. 對於查詢,您可以使用SDG提供的SD 庫抽象extension

    2. 對於函數執行,您可以使用SD GemFire的Function ExeAnnotation支持。

    不過要小心,使用函數上下文裏面的SD 抽象不只是要限制查詢到「本地」數據集的PARTITIONRegion。 SD Repos始終在「邏輯」Region的整個數據集上工作,其中數據必須以分區(分片)設置分佈在集羣中的節點上。

    你一定要熟悉GemFire Partitioned Regions

    摘要 ...

    你在上面選擇真的取決於幾個因素,如該方法,包括但不限於:

    1. 你如何在第一時間組織的數據(例如PARTITIONREPLICATE,其是指Region'sDataPolicy)。

    2. 您的驗證邏輯如何服從是提供「標準」,比方說,一個OQL查詢謂詞爲「SELECTRegion數據要驗證。此外,通過應用適當的索引可以進一步提高效率。

    3. 集羣中有多少個節點以及數據是如何分佈的,在這種情況下,Function可能是最有利的方法......即將邏輯帶到您的數據而不是數據到您的邏輯。後者涉及根據您的拓撲和配置(即「單跳訪問」等)在數據所在的節點上選擇可能涉及多個網絡跳躍到包含數據的節點的匹配數據,將數據序列化到通過線路發送,從而增加網絡的飽和度等等)。

    4. 根據您的UC,其他要考慮的因素是您的到期/收回策略(如數據是否已溢出到磁盤),所需要驗證的基礎上多久的數據變化等

    5. 頻率

    大多數情況下,最好先驗證數據並及時發現錯誤。當然,隨着數據的更新,您可能還需要執行後續的驗證,但這並不能代替儘可能早的(儘可能)驗證。

    有許多因素需要考慮,最佳方法並不總是很明顯,所以測試並確保優化和整體方法具有預期的效果。

    希望這會有所幫助!

    問候, -John

    0

    設置的PDX串行器,並使用查詢服務,讓您的元素。 「從/地區選擇元素,其中id = xxx」。這將返回你的元素字段而不反序列化記錄。確保id已編入索引。

    如果您的入站數據是流式傳輸而不是客戶端查詢(如函數服務),還有其他方法可以快速驗證。