2012-03-22 23 views
22

Estoy empezando con Redis con Rails, así que esta puede ser una pregunta tonta.Guardar un HASH a Redis en una aplicación de rieles

Estoy tratando de guardar un hash para redis server pero cuando lo recupero es solo una cadena IE.

hash = {"field" => "value", "field2" => "value2"} 
$redis.set('data', hash) 

#So collecting the data 
@data = $redis.get('data') 

Esto obviamente no es correcto ya que regresa como una cadena.

También he intentado hacer bucles de algunos resultados y usar hset ie.

@data.each do |d| 
    $redis.hset('data', d.field, d.value) 
end 

# errror 
# ERR Operation against a key holding the wrong kind of value 

No estoy seguro de dónde ir. He eliminado la clave $ redis.del ('datos') para asegurarme de que ese no sea el problema.

espera que usted pueda asesorar, Lee

+0

El póster parece querer un dict ruby ​​almacenado como una cadena serializada, pero obtengo el mismo error al hacer hset aunque la clave es un hash. ¿Alguien puede adivinar por qué podría ser? – arkanciscan

+0

¡Lo descubrí! No era que estuviera haciendo un HSET en una cadena, sino que estaba haciendo un GET en un hash cuando debería haber estado usando HGETALL. – arkanciscan

Respuesta

48

Debería haber leído los documentos redis más a fondo.

Respuesta:

IN 
$redis.set 'data', hash.to_json 

OUT 
data = JSON.parse($redis.get("data")) 
+4

Está bien si lo que quieres hacer es almacenar un hash serializado, pero en realidad quiero un hash de redis, y estoy obteniendo este error también. – arkanciscan

+0

Gracias por señalar la solución. Tampoco leí los documentos redis con cuidado. Esta solución también puede usarse para todo tipo de objeto ruby. [redis doc] (https://github.com/redis/redis-rb/blob/master/README.md#storing-objects) –

1

Cuando se utiliza $redis.set('data', hash) que en realidad el ahorro de una cadena normal Redis, a pesar de que se utiliza una variable de hash (que podría ser serializado a cadena JSON, pero realmente no estoy seguro acerca de eso).

Intente usar $redis.hset('data', hash) (no recorriendo los campos como lo hizo).

Otro punto: ¿Seguro que borraste la clave anterior por completo? ¿Intentó hset una clave completamente diferente para eliminar la opción de que la clave de cadena anterior todavía está "ahí fuera"?

+3

$ redis.hset ('data', hash), me da error: número incorrecto de argumentos (2 por 3). hset los establece individualmente. También probé $ redis.hmset ('data', hash) y obtuve el error: ERR número incorrecto de argumentos para el comando 'hmset' – Lee

+0

'hset' tiene un parámetro adicional' campo' Ver: http://redis.io/commands/hset – theUtherSide

39

La gema Redis remapeará el hash de la siguiente manera:

$redis.mapped_hmset "test", { foo: "bar" } 
$redis.hgetall "test" => {"foo"=>"bar"} 
+3

Solo tenga cuidado, los hashes internos se devuelven como cadenas. Almacenando '{: a => 1,: b => {: c => 2}}' se devuelve como '{" a "=>" 1 "," b "=>" {: c => 2 } "}' Además, pierde claves simbolizadas. – lardcanoe

+2

Un poco tarde para la fiesta, pero usando 'transform_keys' o' deep_symbolize_keys' puedes volver a simbolizar esas claves sin simbolizar. – rtfminc

8

Con el fin de salvar a un hash en Redis. Debe pasar la clave como primer parámetro y luego los siguientes parámetros deben ser las claves y los valores en el método hmset.

$redis.hmset('user:007', :name, 'Antonio', :busy, 'maybe', :ping, 'pong') 

Happy Coding.

+0

Gracias, deseando una feliz codificación de DIOS. – EGurelli

Cuestiones relacionadas