簡體   English   中英

我可以通過哪些方式設計密鑰來提高Redis Set性能?

[英]What are some ways I can design my keys to increase redis set performance?

我為每個州指定的個人設置了一組ID

people/stateName:VA = {1,2,3,4,5,6} 
people/stateName:TX = {7,8,9,10,11}
...

我有一組公司1的個人的ID

people/company:1 = {2,6,7,10}

在上面的示例中,如果我想找到屬於公司1並處於VA和TX狀態的所有人員,則可以執行以下操作:

SUNIONSTORE tempkey people/stateName:VA people/stateName:TX
SINTERSTORE tempkey tempkey people/company:1

數學上: (A ∪ B) ∩ C

但是,在我的情況下,狀態數未知,因此您必須遍歷所需狀態集的列表,將它們組合起來,最后與公司相交(您必須重復如果您擁有一家以上的公司,請執行此過程)

foreach( state in state_list ){
    SUNIONSTORE(tempkey_state,tempkey_state, 'people/stateName:{state}')
}
foreach( companyNumber in company_list ){
    SUNIONSTORE(tempkey_company, tempkey_company, 'people/company:{companyName}')
}

SINTERSTORE(resultkey, tempkey_state, tempkey_company);

在我的真實場景中,每個集合都非常大,有10,000-1,000,000個成員。 但是,此過程可能很慢(在某些情況下比SQL慢)

根據我的理解,瓶頸是SUNIONSTORE ,因為它隨着每次迭代而增長,並且具有很大的O(N)O

有什么方法可以更快地完成我想做的事情? 我想到的一些解決方案

  • 為公司下的州(例如,people / company:1 / state:VA)設置密鑰空間,這將大大減少我的時間,但會大大增加我必須存儲的密鑰數量
  • 如果該特定查詢的redis較慢,則退回SQL

你怎么看?

集的代數包括交換定律和分配定律,因此:

(A ∪ B) ∩ C = (C ∩ A) ∪ (C ∩ B)

Redis使用交換定律來優化交點計算:在應用其算法之前,它會按大小對集合進行排序,以最大程度地減少操作次數。

此外,並集和相交操作的性能主要受對象創建成本(涉及內存分配)的支配,而不是實際的並集/相交算法。

在您的示例中,我想說為州設置大型集的概率高於為公司設置大型集的概率,所以我寧願執行:

MULTI
SINTERSTORE tmp1 people/company:1 people/stateName:VA
SINTERSTORE tmp2 people/company:1 people/stateName:TX
SUNION tmp1 tmp2
DEL tmp1 tmp2
EXEC

在這里,Redis名稱空間中實際創建的唯一對象已經是相交的結果,可能會產生更少的對象。 請注意,最后一個並集不存儲結果,而是將其直接返回給客戶端。

確保使用管道還可以最大程度地減少網絡往返次數。

如果您有多個公司,則可以在其集合上應用聯合(如果公司集合的平均大小不太高),或者可以對每個公司重復此模式幾次(如果公司太大)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM