2011-04-14 22 views
7

No soy un novato de redis, y tengo un conjunto de datos de varios millones de ID de miembros, correos electrónicos y nombres de usuario, y estoy pensando en almacenarlos, por ejemplo, en estructuras de listas. Creo que list y sorted set pueden ser los mejores para mi caso.redis structure, performance

En este momento, estoy usando la primera letra del nombre de usuario para indexar en una lista y enviar datos a la lista posterior: rpush list:name:a username,member_id. Sin embargo, dado que la lista no está ordenada, ¿será lento recuperar un cierto registro dentro de varios millones de entradas?

¿Un conjunto ordenado (porque está ordenado) será mejor que una lista en este caso? O bien, ¿tiene alguna otra recomendación para aumentar el rendimiento?

La clave para acceder a los registros debe ser el nombre de usuario y el correo electrónico.

Respuesta

14

Acceder a una lista por cualquier índice que no esté cerca de la parte frontal o final será costoso, con un costo de O (N). Para listas grandes, esto no es muy eficiente.

El uso de hashes puede ser una mejor opción para sus necesidades. Esto utilizará más memoria que una lista, pero proporcionará casi O (1) acceso.

Un hash en redis es una clave con nombre que puede contener campos y valores arbitrarios.

Puede almacenar el registro completo del usuario en un solo hash redis, nombrado con el member_id (esperemos que este sea un valor corto). Si el member_id se garantiza que sea único para cada usuario, aquí es cómo llenar un hash de usuario con member_id 42.

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

El Redis "nombre clave" aquí es "usuario: 42". Cada usuario obtendrá una sola clave, similar a una sola fila en una base de datos SQL, pero más flexible. A continuación, puede actualizar dos valores hash auxiliares: uno para asignar nombres de usuario a member_id y otro para asignar direcciones de correo electrónico a member_id. Esto supone que tiene una relación 1: 1 entre member_id, username y email address.

hset username_to_id foobar 42 
hset email_to_id [email protected] 42 

Cuando tenga que buscar la dirección de correo electrónico para un usuario particular, primero busca la member_id del email_to_id hash y luego recuperar el campo email a partir del hash al usuario clave: member_id Del mismo modo, puede comenzar con un nombre de usuario, buscar el member_id en el hash username_to_id, y luego llegar al registro del usuario almacenado en el usuario: member_id hash.

Aquí se muestra un ejemplo para buscar el nombre de usuario dado una dirección de correo electrónico:

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

puede agregar más registros para el usuario mediante la adición de más campos para el "usuario: " hash. Si desea incrementar un contador de inicio de sesión, que es sencillo, así:

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> 

puede encontrar en el sitio more information about hashes redis.io.

+0

muchas gracias. pero, ¿por qué no se establece u ordena el conjunto – Leon

+0

, pero si 1 m de usuario significa que obtuvo 1m de identificación hash, cuando se vuelve particular, reducirá el rendimiento – Leon