2011-07-11 62 views
2

我想使用Redis的存儲大集user_ids,並與這些 IDS,在該用戶以前被分配了「羣組ID」的:在redis中的高效查找表 - 使用redis集實現?

User_ID | Group_ID 
    1043 | 2 
    2403 | 1 

user_ids的數量是相當大的( 〜1000萬);獨特的 組ID的數量約爲3 - 5

我給這家LUT目的是家常便飯:

  • 找到一個給定用戶組ID;和

  • 返回的其他用戶的列表(指定長度)與同 組ID,鑑於用戶

有可能是一個地道的方式redis的,或者至少做到這一點一種最有效的方式。如果是這樣我想知道它是什麼。這是我的工作實現的簡化版本(使用Python客戶端):

# assume a redis server is already running 
# create some model data: 
import numpy as NP 
NUM_REG_USERS = 100 
user_id = NP.random.randint(1000, 9999, NUM_REG_USERS) 
cluster_id = NP.random.randint(1, 4, NUM_REG_USERS) 
D = zip(cluster_id, user_id) 

from redis import Redis 
# r = Redis() 

# populate the redis LuT: 
for t in D : 
    r.sadd(t[0], t[1]) 

# the queries: 
# is user_id 1034 in Group 1? 
r.sismember("1", 1034) 

# return 10 users in the same Group 1 as user_id 1034: 
r.smembers("1")[:10]  # assume user_id 1034 is in group 1 

所以,我已經實現了使用該LUT普通Redis的;每組都鍵入一個組ID(1,2或3),所以總共有三組。

這是最有效的方式存儲這些數據給予我想運行的查詢類型嗎?

回答

1

使用套是一個很好的基本方法,雖然有幾件事情在那裏,你可能要改變:

除非你存儲組ID爲每一個用戶的地方,你將需要5個往返得到一個特定用戶的組 - 操作本身是O(1),但您仍然需要考慮延遲。通常這很容易做到這一點,沒有太多的努力 - 你有很多其他屬性存儲爲每個用戶,所以它是微不足道的添加一個組ID。

你可能想要SRANDMEMBER而不是SMEMBERS--我認爲SMEMBERS會每次從你的百萬項目中返回相同的10個項目。

+0

您可以使用流水線合併5個請求:http://redis.io/topics/pipelining –