2012-01-10 76 views
4

我正在使用redis與多個數據庫(我通過SELECT命令切換)。Redis SELECT性能

我將不同類型的信息存儲到redis中,我需要以某種方式將其分離。我不喜歡在密鑰的前面加上前綴來區分信息類型,所以我創建了更多的數據庫。

我想問問這是否是一個正確的決定,關注性能?

SELECT還會產生多少開銷?如果我需要遍歷來自說兩個數據庫的某些相關數據,哪種方法更好(請參閱僞代碼)?

for data in array { 
    redis_select(0) 
    k = redis_get(...) 
    redis_select(1) 
    k2 = redis_get(k) 
} 

redis_select(0) 
k = [] 
for data in array { 
    k[x] = redis_get(...) 
} 

redis_select(1) 
k2 = [] 
for data in array { 
    k2[x] = redis_get(k[x]) 
} 

回答

7

您可以使用Redis的數據庫概念,以單獨的數據。這在目前的版本中得到了完全支持,並且在未來的版本中仍將得到支持。

現在,這不是隔離數據的推薦解決方案。相反,運行多個Redis實例會更好。實例的開銷非常低(小於1 MB),因此您可以在任何盒子上啓動其中的幾個。它具有更高的可擴展性(工作負載將分佈在多個CPU內核上,而不僅僅是一個)。它更加靈活(您可能希望爲每個數據集或不同的轉儲文件使用不同的配置參數)。您的客戶只需要打開每個實例的一個連接即可訪問各種數據集。

現在,如果您仍想使用Redis數據庫並關注性能,則需要評估它們所代表的額外往返數。對於像Redis這樣的內存數據庫,所有基本操作的成本幾乎相同,因爲它由通信和協議管理支配,而不是由執行本身支配。所以當鍵/值很小時,GET,SET,SELECT命令傾向於具有相同的成本。每次執行SELECT時,就像執行額外的GET或SET命令一樣。

以您的示例爲例,第一個提議將爲每個數組項目生成4個命令。第二個提議每個項目只會生成2個命令,因此效率更高。如果項目數量很大,則第二個提議中的SELECT成本可以忽略不計,但它不在第一個提案中。

如果您計劃在數組上迭代以運行Redis命令,請考慮使用可變參數命令(如MGET/MSET)或流水線(如果客戶端支持它),以減少往返次數。