2011-10-28 10 views
5

Me dijeron que use Redis para usuarios autenticados en la tienda en mi aplicación en Heroku, así que decidí dar el salto hoy. Lo que quiero hacer es almacenar los hashes de los usuarios en la tienda Redis como esto:Buscando por valores múltiples dentro de una clave/valor redis

{ 
    id:4532143215432, 
    username:'davejlong', 
    email:'[email protected]' 
} 

y luego quiero ser capaz de buscar por nombre de usuario o ID. ¿Es esto posible con Redis de alguna manera?

Estoy utilizando el módulo de Redis Node.js que apoya ningún comando Redis https://github.com/mranney/node_redis

Respuesta

2

Hay algunos problemas en @orangeoctopus usecae.

Redis 127.0.0.1:6379> Identificación del HMSET: 4532143215432 nombre de usuario davejlong ​​[email protected] OK Redis 127.0.0.1:6379> HMSET usuario: id davejlong ​​4532143215432 correo electrónico [email protected] OK

Esto hará una duplicación, piense en agregar nuevos valores y eliminar & actualizando.

Así que prefieren este

SET user:davejlong 1 
HMSET user:1 username davejlong email [email protected] 

1) En caso de nombre de usuario

redis.get('user:davejlong',function(err,id){ 
    console.log('User Id of @davejlong: ' + id); 
    redis.hgetall('user:'+id,function(err,user){ 
     console.log('User Data: ' + user); 
    }) 
    }) 

2) En caso de Id

redis.hgetall('user:1',function(err,user){ 
     console.log('User Data: ' + user); 
    }) 
+0

He eludido esto con "Una forma más compacta de hacer esto ..." pero era demasiado flojo para escribirlo. +1 –

+0

@philpirozhkov cuál ... –

+0

Lamento no haber entendido este punto ya que no está agregando la capacidad de buscar por correo. 'Usuario SET: [email protected] 1' y puede encontrarlo por correo –

3

Es tan simple como almacenar cada usuario dos veces. Una vez con la clave de identificación y una vez con la clave de nombre de usuario.

Una forma más compacta de hacer esto en términos de memoria es tener nombres de usuario clave para los identificadores, por lo que su consulta de nombre de usuario le gustaría como: consultar por nombre de usuario, obtener ID; poner en id, obtener información.

Desafortunadamente, no hay una buena manera de tener la misma información real con dos claves diferentes.


Por ejemplo, cuando se insertaría un nuevo usuario y entonces se le pregunta por ella:

redis 127.0.0.1:6379> HMSET id:4532143215432 username davejlong email [email protected] 
OK 
redis 127.0.0.1:6379> HMSET user:davejlong id 4532143215432 email [email protected] 
OK 
redis 127.0.0.1:6379> HGET id:4532143215432 username 
"davejlong" 
redis 127.0.0.1:6379> HGET user:davejlong id 
"4532143215432" 
redis 127.0.0.1:6379> HMGET user:davejlong email id 
1) "[email protected]" 
2) "4532143215432" 
redis 127.0.0.1:6379> DEL user:davejlong 
(integer) 1 
redis 127.0.0.1:6379> DEL id:4532143215432 
(integer) 1 

Observe que cuando estoy creando el usuario, utilizo HMSET dos veces. Ahora puedo consultar contra el nombre de usuario o la identificación. También tengo que borrar ambas claves ahora.

+0

¿Me podría mostrar cómo lo haría en la CLI? Soy nuevo en todas estas cosas de redis, así que no estoy seguro si usar un hash, lista, etc. –

+0

Mi respuesta ha sido actualizada con un ejemplo. –

+0

Usted está creando datos duplicados aquí. Considere los índices de uso. –

Cuestiones relacionadas