2011-04-14 6 views
7

Je suis un novice de redis, et j'ai un ensemble de données de plusieurs millions de membres ID, courriels et noms d'utilisateurs, et je pense à les stocker par exemple dans les structures de liste. Je pense que list et sorted set peut être le mieux adapté à mon cas.redis structure, performance

En ce moment, j'utilise la première lettre du nom d'utilisateur pour indexer dans une liste et pousser les données vers la liste de retour: rpush list:name:a username,member_id. Cependant, puisque la liste n'est pas triée, la récupération d'un certain enregistrement dans plusieurs millions d'entrées sera-t-elle lente?

Un ensemble trié (parce qu'il est trié) sera-t-il préférable à une liste dans ce cas? Ou avez-vous d'autres recommandations pour augmenter les performances?

La clé pour accéder aux enregistrements doit être nom d'utilisateur et adresse e-mail.

Répondre

14

L'accès à une liste par un index qui n'est pas proche de l'avant ou de la fin sera coûteux et coûtera O (N). Pour les grandes listes, ce n'est pas très efficace.

L'utilisation de hachages peut être mieux adaptée à vos besoins. Cela utilisera plus de mémoire qu'une liste, mais fournira un accès proche de O (1).

Un hachage dans redis est une clé nommée pouvant contenir des champs et des valeurs arbitraires.

Vous pouvez stocker l'ensemble de l'enregistrement de l'utilisateur dans un seul hachage redis, nommé en utilisant l'attribut member_id (nous espérons qu'il s'agit d'une valeur courte). Si le member_id est garantie unique par utilisateur, voici comment remplir un hachage pour l'utilisateur avec member_id 42.

hset user:42 email [email protected] 
hset user:42 username foobar 
hset user:42 logincount 0 

Le Redis « Nom de la clé » ici est « l'utilisateur: 42 ». Chaque utilisateur obtiendra une clé unique, similaire à une seule ligne dans une base de données SQL, mais plus flexible. Vous pouvez ensuite mettre à jour deux hachages auxiliaires: l'un pour mapper les noms d'utilisateur sur member_id, et l'autre pour mapper les adresses e-mail sur member_id. Cela suppose que vous avez une relation 1: 1 entre member_id, nom d'utilisateur et adresse e-mail.

hset username_to_id foobar 42 
hset email_to_id [email protected] 42 

Lorsque vous devez rechercher l'adresse e-mail pour un utilisateur particulier, vous devez d'abord regarder la member_id du hachage email_to_id puis récupérer le champ email du hachage à clé utilisateur: member_id De même, vous peut commencer avec un nom d'utilisateur, rechercher l'ID de membre dans le hachage username_to_id, puis accéder à l'enregistrement utilisateur stocké dans l'utilisateur: member_id hachage.

Voici un exemple pour la recherche le nom d'utilisateur donné une adresse e-mail:

redis> hget email_to_id [email protected] 
"42" 
redis> hget user:42 username 
"foobar" 
redis> 

Vous pouvez ajouter plusieurs enregistrements à l'utilisateur en ajoutant plus de champs à « utilisateur: » hachage. Si vous voulez incrémenter un compteur de connexion, qui est simple ainsi:

redis> hincrby user:42 login_count 1 
(integer) 1 
redis> hgetall user:42 
1. "email" 
2. "[email protected]" 
3. "username" 
4. "foobar" 
5. "login_count" 
6. "1" 
redis> 

Vous pouvez trouver more information about hashes sur le site redis.io.

+0

merci beaucoup. mais pourquoi ne pas définir ou trier – Leon

+0

mais si 1 m de l'utilisateur est moyen d'obtenir 1m hash id, quand vous obtenez en particulier, cela va réduire les performances – Leon

Questions connexes