2015-08-28 13 views
30
# I have the dictionary my_dict 
my_dict = { 
    'var1' : 5 
    'var2' : 9 
} 
r = redis.StrictRedis() 

Come memorizzare my_dict e recuperarlo con redis. Ad esempio, il seguente codice non funziona.Come memorizzare e recuperare un dizionario con redis

#Code that doesn't work 
r.set('this_dict', my_dict) # to store my_dict in this_dict 
r.get('this_dict') # to retrieve my_dict 

risposta

50

Puoi farlo da hmset (chiavi multiple possono essere impostate tramite hmset).

hmset("RedisKey", dictionaryToSet)

import redis 
conn = redis.Redis('localhost') 

user = {"Name":"Pradeep", "Company":"SCTL", "Address":"Mumbai", "Location":"RCP"} 

conn.hmset("pythonDict", user) 

conn.hgetall("pythonDict") 

{'Company': 'SCTL', 'Address': 'Mumbai', 'Location': 'RCP', 'Name': 'Pradeep'} 
+13

se è una struttura di dati nidificata piuttosto che semplicemente dict, ad esempio contiene alcuni array ecc. Serializza i tuoi dati con 'json.dumps()' scrive come stringa e dopo aver ripreso da redis user 'json.load() 'per deserializzare di nuovo la struttura dati python – andi

+1

' json.dumps() 'e' json.loads() 'funzionerà solo se si sta bene con le chiavi del dizionario sempre stringhe. Se non lo sei, potresti prendere in considerazione l'uso di pickle. – ryechus

+0

Provate https://github.com/richardasaurus/persistent-dict – NotHilaryClinton

2

Il comando redis memorizza una stringa, non dati arbitrari. Si potrebbe provare a utilizzare il comando Redis HSET per memorizzare il dict come un hash Redis con qualcosa come

for k,v in my_dict.iteritems(): 
    r.hset('my_dict', k, v) 

ma i tipi di dati Redis ei tipi di dati pitone non lo fanno linea del tutto fino. I dit Python possono essere nidificati arbitrariamente, ma un hash redis richiederà che il tuo valore sia una stringa. Un altro approccio si può prendere è quello di convertire i dati pitone a stringa e memorizzare che nel Redis, qualcosa come

r.set('this_dict', str(my_dict)) 

e poi quando si ottiene la stringa di fuori è necessario analizzarlo per ricreare l'oggetto pitone.

+1

può convertire i suoi dati in json e memorizzare il risultato in redis –

15

puoi decapitare il tuo dettato e salvare come stringa.

import pickle 
import redis 

r = redis.StrictRedis('localhost') 
mydict = {1:2,2:3,3:4} 
p_mydict = pickle.dumps(mydict) 
r.set('mydict',p_mydict) 

read_dict = r.get('mydict') 
yourdict = pickle.loads(read_dict) 
+1

Questo è vero, ma a seconda della velocità delle letture e delle scritture, questo può aggiungere un sovraccarico serio. Il decapaggio è un'operazione lenta – Tommy

9

Un altro modo: è possibile utilizzare RedisWorks biblioteca.

pip install redisworks

>>> from redisworks import Root 
>>> root = Root() 
>>> root.something = {1:"a", "b": {2: 2}} # saves it as Hash type in Redis 
... 
>>> print(root.something) # loads it from Redis 
{'b': {2: 2}, 1: 'a'} 
>>> root.something['b'][2] 
2 

converte tipi pitone a REDIS tipi e viceversa.

>>> root.sides = [10, [1, 2]] # saves it as list in Redis. 
>>> print(root.sides) # loads it from Redis 
[10, [1, 2]] 
>>> type(root.sides[1]) 
<class 'list'> 

Disclaimer: Ho scritto la biblioteca. Ecco il codice: https://github.com/seperman/redisworks

0

Se si desidera memorizzare un dict python in redis, è meglio memorizzarlo come stringa json.

import redis 

r = redis.StrictRedis(host='localhost', port=6379, db=0) 
mydict = { 'var1' : 5, 'var2' : 9, 'var3': [1, 5, 9] } 
rval = json.dumps(mydict) 
r.set('key1', rval) 

Durante il recupero de-serializzare utilizzando json.loads

data = r.get('key1') 
result = json.loads(data) 
arr = result['var3'] 

io preferisco SET/GET sopra HMSET/HGETALL perché il tempo la complessità di quest'ultima operazione è O (N).

E i tipi (ad es. Byte) non serializzati dalle funzioni JSON?

È possibile scrivere funzioni encoder/decoder per tipi che non possono essere serializzati con le funzioni JSON. per esempio. scrittura di base64/ASCII funzione encoder/decodificatore per array di byte.

+0

Ho downvoted questo perché alcuni dicts non possono essere serializzati su JSON, ad esempio, dicts con un valore in byte. – Tommy

+0

È possibile scrivere una funzione codificatore/decodificatore (in base al requisito, ad esempio codifica base64/ascii) per i tipi che non possono essere codificati/decodificati per impostazione predefinita. –

+0

@Tommy: anche se si utilizza hmset/hgetall, potrebbe essere necessario codificare/decodificare i tipi che non sono supportati dai redis. –

Problemi correlati