2014-04-23 5 views
6

Ich spielte mit Flashmikroframework und wollte einige Daten in redis zwischenspeichern. Lassen Sie uns sagen, ich habe diese dict:redispy und hgetall Verhalten

mydict = {} 
mydict["test"] = "test11" 

ich es gerettet Redis mit

redis.hmset("test:key", mydict) 

jedoch nach

stored = redis.hgetall("test:key") 
print(str(stored)) 

wiederherstellen ich seltsam sehen {b'test': b'test11'} so stored.get("test") mich gibt keine

mydict Str Methode Ergebnis sieht gut aus {'test': 'test11'}. Also, warum dieser binäre Marker zu wiederhergestellten Daten hinzugefügt? Ich habe auch redis-cli eingecheckt und sehe dort keine expliziten b-Marker. Stimmt etwas nicht mit hgetall?

+1

Wenn jemand interessiert, hier Antwort vom Entwickler ist: https://github.com/andymccurdy/redis-py/issues/463#issuecomment-41229918 – Tommi

Antwort

12

Dies ist das beabsichtigte Verhalten. Standardmäßig werden Strings aus Redis nicht decodiert. Sie haben ein paar Optionen:

  • Entschlüsseln Sie die Daten selbst.
  • Erstellen Sie eine Clientinstanz mit dem Argument decode_responses, z. B. StrictRedis(decode_responses=True). Dies wird alle Zeichenfolgen decodiert, die von Redis basierend auf dem charset-Argument (die standardmäßig zu utf-8 ist) stammen. Nur das ist sicher, dass jede Antwort von Redis String-Daten hat, die Sie zu utf-8 dekodieren möchten. Wenn Sie die gleiche Clientinstanz verwenden, um Binärdaten wie ein gebeiztes Objekt zu erhalten, sollten Sie diese Option nicht verwenden, wenn Sie verwenden. In diesem Fall würde ich vorschlagen, eine separate Client-Instanz für die Binärdaten zu verwenden.

Quelle: https://github.com/andymccurdy/redis-py/issues/463#issuecomment-41229918

+1

Dieses Argument undokumentiert ist und es scheint nicht zu funktionieren: 'python3' ' >>> import redis' '>>> POOL = redis.ConnectionPool (host = 'localhost', port = 6379, db = 0)' '>>> datastore = redis.StrictRedis (verbindungs_pool = POOL, decode_responses = True) ' ' >>> mydict = {} ' ' >>> mydict ["test"] = "test11" ' ' >>> datastore.hmset ("test: schlüssel", mydict) ' ' True' '>>> stored = datastore.hgetall (" test: key ")' '>>> gespeichert' ' {b'test ': b'test11'} ' – mezzomondo

+0

gleich hier, funktioniert nicht für lrange, oder semberbs – eugene

2
POOL = redis.ConnectionPool(host='localhost', **decode_responses=True**, port=6379, db=0) 
datastore = redis.StrictRedis(connection_pool=POOL) 

, wenn Sie die Connection verwenden, sollten Sie die decode_responses bewegen = True an den Konstruktor von Connection.