2012-07-01 26 views
5

Redis es conceptualmente diferente de las bases de datos SQL tradicionales que utilizo, y estoy tratando de averiguar si es adecuado para mi proyecto ... He estado buscando pero no puedo encontrar una respuesta a mi pregunta.Redis y valores de consulta

Tengo un conjunto de usuarios que debo almacenar, cada uno con una ID única y varios valores (como su nombre) asociados. Parece como si simplemente puedo almacenar los como un hash:

user:fef982dcfe1a7bcba4849b4c281bba95 
"username" "andrewm" "name" "Andrew" 

También tengo un montón de mensajes que desea almacenar, cada uno con una serie de propiedades como el remitente y el destinatario:

message:1a7bcba4849b4c281bfef98a952dcfeb 
"sender" "fef982dcfe1a7bcba4849b4c281bba95" "recipient" "82dcfe1a7bcba4849b4c281bba95fef9" "message" "Hi!" 

Mi pregunta es, ¿cómo voy a recuperar todos los mensajes enviados por un usuario específico (designado por su hash). ¿Debo utilizar una base de datos relacional tradicional en su lugar, o incluso una base de datos NoSQL como MongoDB (que he usado antes)? Si es así, ¿alguien tiene alguna sugerencia para las tiendas de alto rendimiento? No haré ninguna búsqueda verdadera (es decir, consultas de MySQL LIKE), solo búsquedas de valores clave, realmente.

Respuesta

7

Sin duda es posible modelar estos datos con Redis, pero debe pensar en términos de estructuras de datos Y rutas de acceso. Con Redis, las rutas de acceso no se gestionan implícitamente (como con los índices en RDBMS/MongoDB).

Para el ejemplo proporcionado, usted podría tener:

user:<user hash> -> hash of user properties 
user:<user hash:sent -> set of <msg hash> 
user:<user hash>:received -> set of <msg hash> 
message:<msg hash> -> hash of message properties 

añadir/borrar un mensaje significaría mantener el *: enviado y *: recibida conjuntos correspondientes a los remitentes y destinatarios, en la parte superior de añadir/borrar el objeto de mensaje en sí.

Recuperación de los mensajes enviados o recibidos por un usuario dado es simplemente un comando SMEMBERS, o una especie si desea recuperar también las propiedades del mensaje al mismo tiempo:

# Get a list of message hash codes only in one roundtrip 
smembers user:<user hash>:received 

# Get a list of message contents in one roundtrip 
sort user:<user hash>:received by nosort get message:*->sender get message:*->message 

Para la justificación sobre el uso Ordena, véase:

Nota 1: con Redis es mejor utilizar enteros como claves en lugar de UUID o códigos hash (especialmente en conjuntos), ya que se almacenan de una manera más eficiente.

Nota 2: si necesita ordenar los mensajes, entonces se deben usar listas en lugar de conjuntos. La consecuencia es que solo se pueden eliminar los mensajes más antiguos y solo se pueden agregar los nuevos mensajes de manera eficiente. Probablemente también deba agregar una lista global para todos los mensajes.

+0

Muchas gracias por esa explicación, fue muy útil. Lo echaré un vistazo :) –

+0

Hola, gracias, muy útil. Si "Agregar/eliminar un mensaje significaría mantener los conjuntos *: enviado y *: recibido", ¿necesitaría más espacio para almacenar los datos y, por lo tanto, ocuparía más espacio en la memoria? ¿Podría ser un problema para el rendimiento si este tipo de "multi-tienda" se realiza a menudo? Gracias por su ayuda – Loic

+0

Sí, representa más datos para almacenar. En lo que respecta al rendimiento, se supone que debe utilizar la canalización para amortizar el impacto de hacer varios comandos para una operación determinada. Ver http://redis.io/topics/pipelining –

Cuestiones relacionadas