2011-07-11 1 views
2

Iがuser_idsの大きなセットを格納するためのRedisを使用して、そのユーザが以前に割り当てられたこれら 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 

ので、私は普通のRedisにセットを使用して、このLUTを実装しています。各セットはグループID(1、2、または3)にキーされているため、合計で3つのセットがあります。

これは、実行したいクエリの種類に応じて、このデータを格納する最も効率的な方法ですか?あなたはユーザーごとにグループIDを保存しない限り

をどこかにあなたが得るために5ラウンドトリップが必要になります。セットを使用して

答えて

1

は物事のカップルがそこにありますが、変更したいことがあり、優れた基本的な考え方であります特定のユーザーのグループ - 操作自体はO(1)ですが、依然として待ち時間を考慮する必要があります。通常はあまりにも多くの労力を費やすことなくこれを行うのはかなり簡単です。ユーザーごとにたくさんのプロパティが格納されているので、グループIDに1つ追加するのは簡単です。

あなたはおそらくSMEMBERSではなくSRANDMEMBERを望んでいます - SMEMBERSは毎回あなたの百万のアイテムセットから同じ10アイテムを返すと思います。

+0

パイプライニングを使用して5つのリクエストを組み合わせることができます。http://redis.io/topics/pipelining –

関連する問題