2011-04-20 29 views
22

tengo que ahorrar un modelo de usuario, algo así como:rendimiento Redis, almacenar JSON objeto como una cadena

{ "nickname": "alan", 
    "email": ..., 
    "password":..., 
    ...} // and a couple of other fields 

Hoy en día, utilizan un conjunto: los usuarios
en esta serie, tengo un miembro como usuario Alan
En este miembro de que tiene el hash anterior

esto está funcionando bien, pero me preguntaba si en lugar del enfoque anterior que podría tener sentido para utilizar el siguiente:

Aún usarnos ERS Conjunto (para llegar fácilmente a los usuarios (miembros) de la lista)
En este conjunto sólo utilizan un almacenamiento de clave/valor como:

clave: Alan valor : la versión stringify del hash del usuario, encima

Recuperando un registro sería más fácil (tendré que analizarlo con JSON).

Soy muy nuevo en redis y no estoy seguro de cuál podría ser el mejor. Qué piensas ?

Respuesta

20

Puede usar la estructura de datos Redis hashes para almacenar sus campos y valores de objeto JSON. Por ejemplo el conjunto de "usuarios" todavía se puede utilizar como una lista que almacena todos los usuarios y su objeto JSON individuo puede ser almacenado en hash de la siguiente manera:

db.hmset("user:id", JSON.stringify(jsonObj)); 

Ahora usted puede conseguir con llave todos los usuarios o sólo una específica (de la cual obtiene/establece solo campos/valores especificados). También thesetwo preguntas probablemente estén relacionadas con su situación.

EDIT: (lo siento, no me di cuenta de que hemos hablado de esto antes)

recuperar un registro sería entonces más fácil (a continuación, voy a tener que analizarlo con JSON).

Esto es cierto, pero con la estructura de datos hash puede obtener/configurar solo el campo/valor con el que necesita trabajar. Recuperar todo el objeto JSON puede dar como resultado una disminución del rendimiento (depende de la frecuencia con que lo haga) si solo quiere cambiar parte del objeto (otra cosa es que deberá realizar una cadena/analizar el objeto cada vez).

+0

sí, tienes razón. Tengo tu punto. Gracias – Luc

2

A decir verdad, de cualquier manera funciona bien. La forma de almacenarlo es una decisión de diseño que deberá tomar. Depende de cómo quiera recuperar la información del usuario, etc.

En términos de rendimiento, el almacenamiento de la versión codificada JSON del objeto de usuario utilizará menos memoria y tomará menos tiempo para el almacenamiento/recuperación. Es decir, el análisis JSON es probablemente más rápido que recuperar cada campo de Redis. Y, incluso si no, probablemente sea más eficiente con la memoria. La diferencia en el rendimiento es probablemente mínima de todos modos.

7

Un mérito adicional para JSON sobre hashes es mantener el tipo. 123.3 se convierte en la cadena "123.3" y, según la biblioteca Null/None, se puede castear accidentalmente en "null".

Ambos son un poco tedioso ya que esto requeriría escribir un transformador para la extracción de las cuerdas y convertirlos de nuevo a sus tipos esperados.

Para consideraciones de consumo de espacio/memoria, he comenzado a almacenar solo los valores como una lista JSON ["my_type_version", 123.5, null , ... ], así que no tenía una sobrecarga de N * (sum(len(concat(JSON key names))) que en mi caso era + 60% de la memoria utilizada por Redis.

4

tener en cuenta: Los valores hash no puede almacenar objetos anidados, JSON pueden hacerlo.

Cuestiones relacionadas