2012-03-22 12 views
22

Im appena iniziando con Redis con Rails quindi questa forse una domanda stupida.Salvataggio di un HASH a Redis su un'app per rails

Sto cercando di salvare un hash sul server redis ma quando lo recupero è solo una stringa IE.

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

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

Questo è ovviamente errato come il suo ritorno come una stringa.

Ho anche provato ad eseguire il ciclo di alcuni risultati e utilizzando il 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 

Non so dove andare. Ho cancellato la chiave $ redis.del ('data') per assicurarmi che non fosse questo il problema.

spera che possiate consigliare, Lee

+0

Il poster sembra volere un dict rubino memorizzato come stringa serializzata, ma ottengo lo stesso errore quando si fa hset anche se la chiave è un hash. Qualcuno può indovinare perché potrebbe essere? – arkanciscan

+0

Capito! Non era che stavo facendo un HSET su una stringa, era che stavo facendo un GET su un hash quando avrei dovuto usare HGETALL. – arkanciscan

risposta

48

Avrei dovuto leggere i documenti redis più approfonditi.

Risposta:

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

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

Va bene se quello che vuoi fare è archiviare un hash serializzato, ma in realtà voglio un hash redis, e sto ricevendo anche questo errore. – arkanciscan

+0

Grazie per aver indicato la soluzione. Non ho letto attentamente anche i documenti redis. Questa soluzione può essere utilizzata anche per tutti i tipi di oggetti rubino. [redis doc] (https://github.com/redis/redis-rb/blob/master/README.md#storing-objects) –

1

Quando si utilizza $redis.set('data', hash) realmente salvare una stringa regolare Redis, anche se si utilizza una variabile di hash (che potrebbe essere serializzato a stringa JSON, ma io non sono davvero sicuro di esso).

Provare a utilizzare $redis.hset('data', hash) (non eseguendo il ciclo attraverso i campi come avete fatto).

Un altro punto: sei sicuro di aver eliminato completamente la chiave precedente? Hai provato a hset una chiave completamente diversa per eliminare l'opzione che la stringa precedente è ancora "fuori là"?

+3

$ redis.hset ('data', hash), mi dà errore: numero errato di argomenti (2 per 3). hset li imposta individualmente. Ho anche provato $ redis.hmset ('data', hash) e ottenuto errore: ERR numero errato di argomenti per il comando 'hmset' – Lee

+0

'hset' ha un parametro' campo' Vedi: http://redis.io/commands/hset – theUtherSide

39

La gemma Redis sarà rimappare il tuo hash come questo:

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

Basta fare attenzione, gli hash interni vengono restituiti come stringhe. Memorizzare '{: a => 1,: b => {: c => 2}}' viene restituito come '{" a "=>" 1 "," b "=>" {: c => 2 } "}' Inoltre, si perdono le chiavi simbolizzate. – lardcanoe

+2

Un po 'tardi per la festa, ma usando 'transform_keys' o' deep_symbolize_keys' è possibile trasformare i tasti de-simbolizzati in simboli. – rtfminc

8

Al fine di salvare un hash in Redis. È necessario passare la chiave come primo parametro e quindi i parametri successivi devono essere le chiavi e i valori nel metodo hmset.

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

Happy Coding.

+0

Grazie, augurandoti felice codifica da parte di DIO. – EGurelli

Problemi correlati