2012-01-10 19 views
49

Digamos que tengo un hash de hash, p. Ej.Estructuras de datos complejas Redis

$data = { 
    'harry' : { 
     'age' : 25, 
     'weight' : 75, 
    }, 
    'sally' : { 
     'age' : 25, 
     'weight' : 75, 
    } 
} 
  1. ¿Cómo sería la forma 'habitual' para almacenar una estructura de datos
  2. ¿sería capaz de obtener directamente un valor (por ejemplo, hacer que Harry (o no?): La edad
  3. una vez almacenada se puede cambiar directamente el valor de una clave secundaria (por ejemplo, Sally: peso = 100)
+1

Además, ¿cómo podemos clasificar esos datos en Redis ?. Quiero que los 10 mejores nombres obtengan el mayor peso. – Bharat

Respuesta

20

¿Cómo sería la forma 'habitual' para almacenar una estructura de datos (o lo haría no?)

Por ejemplo harry y sally se almacenarán cada uno en hashes donde los campos representarían sus propiedades como la edad y el peso. Entonces la estructura set mantendría a todos los miembros (harry, sally, ...) que ha almacenado en redis.

¿sería capaz de obtener directamente un valor (por ejemplo, hacer que Harry: la edad)

Sí, ver HGET o HMGET o HGETALL.

Una vez almacenados se puede cambiar directamente el valor de una clave de sub (por ejemplo salida: peso = 100)

Sí, ver HSET.

+1

Gracias, ¿debería almacenarse en varias operaciones? p.ej. No pude almacenar la estructura de datos de una vez? Obviamente, este fue solo un ejemplo bastante trivial; ¿querrían almacenar "objetos" más complejos y quizás no entiendan si este es el camino correcto a seguir? – Xrender

+0

Whole redis se basa en operaciones simples entre sus estructuras de datos avanzadas. Puedes intentar mirar [ohm] (http://ohm.keyvalue.org/) que puede abstraerte algunas cosas. – yojimbo87

+0

También puede escribir sus propios scripts en [Lua] (http://redis.io/commands/eval); una aplicación puede enviar un script Lua como si fuera una consulta EVAL y se ejecutará en el servidor Redis, permitiendo que su script Lua ejecute varios comandos Redis sin múltiples viajes de ida y vuelta por la red. – ekillaby

15

permite echar un complejo de datos que hay que almacenar en Redis, por ejemplo ésta:

$data = { 
      "user:1" : { 
         name : "sally", 
         password : "123" 
         logs : "25th october" "30th october" "12 sept", 
         friends : "34" , "24", "10" 
        } 
      "user:2" :{ 
         name : "" 
         password : "4567" 
         logs : 
         friends: "" 
        } 
      } 

El problema al que nos enfrentamos es que los amigos & registros están listas. Entonces, lo que podemos hacer para representar estos datos en redis es usar hashes y enumerar algo como esto:

Opción 1.Un mapa hash con teclas como usuario: 1 y el usuario: 2

 hmset user:1 name "sally" password "12344" 
     hmset user:2 name "pally" password "232342" 
     create separate list of logs as 
       logs:1 { here 1 is the user id } 
       lpush logs:1 "" "" "" 
       lpush logs:2 "" "" "" 
     and similarly for friends. 

Opción 2: Un mapa hash con datos JSON objeto de dumping como codificar cadena

 hmset user:1 name "sally" password "12344" logs "String_dumped_data" friends "string of dumped data" 

Opción 3: Esta es otra representación de # 1

 something like user:1:friends -> as a list 
     and   user:2:friends -> as a list 

Por favor, corrígeme si soy incorrecto.

+0

Si, como principiante en Redis, esas son las soluciones que podría pensar. Pero una consideración que está un paso más allá es la consulta. Digamos que necesitas obtener todos los registros de todos los usuarios que tienen "24" como "Amigo". En el caso 1 tiene que leer todas las listas de amigos y reunir los identificadores de usuario y luego obtener todos los registros. (= Ida y vuelta obligatoria) En el caso 2, no tengo idea si redis tiene la capacidad de consultar dentro de los datos json descartados. Y cuál sería el rendimiento. Y para agregar un tercer caso digamos "Amigos" era un tipo de datos más constante como "Derechos" ¿Una estructura como esta tendría sentido? usuario: 21: amigos: 23-43-12 -> como List –

+0

Para este caso, podemos usar el comando EVAL para el procesamiento interno de lua –

Cuestiones relacionadas