2014-04-23 12 views
6

Grałem z microframework kolby i chciałem cache niektóre statystyki w Redis. Powiedzmy, że mam ten dict:Redis-py i hgetall zachowanie

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

Uratowałem go Redis z

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

Jednak po przywróceniu

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

widzę dziwne {b'test': b'test11'} tak stored.get("test") daje mi żaden

mydict str wynik metody wygląda dobrze {'test': 'test11'}. Dlaczego ten znacznik binarny został dodany do przywróconych danych? Sprawdziłem również redis-cli i nie widzę tam wyraźnych znaczników b. Coś nie tak z hgetall?

+1

Jeśli ktoś zainteresowany, oto odpowiedź od dewelopera: https://github.com/andymccurdy/redis-py/issues/463#issuecomment-41229918 – Tommi

Odpowiedz

12

To jest zamierzone zachowanie. Domyślnie ciągi wychodzące z Redis nie są dekodowane. Masz kilka opcji:

  • Sam dekoduj dane.
  • Utwórz instancję klienta za pomocą argumentu decode_responses, np. StrictRedis(decode_responses=True). Spowoduje to dekodowanie wszystkich ciągów znaków pochodzących z Redis na podstawie argumentu charset (domyślnie dla utf-8). Tyle tylko, że masz pewność, że każda odpowiedź od Redis ma dane stringów, które chcesz odkodować na UTF-8. Jeśli używasz tej samej instancji klienta , aby pobrać dane binarne, takie jak piklowany obiekt, nie należy używać tej opcji. W takim przypadku proponuję użyć osobnej instancji klienta dla danych binarnych.

Źródło: https://github.com/andymccurdy/redis-py/issues/463#issuecomment-41229918

+1

Ten argument jest nieudokumentowane i nie wydaje się działać: 'python3' ' >>> import redis'pl '>>> BASEN = redis.ConnectionPool (host = 'localhost', port = 6379, db = 0)' '>>> datastore = redis.StrictRedis (connection_pool = POOL, decode_responses = True) ' ' >>> mydict = {} ' ' >>> mydict ["test"] = "test11" ' ' >>> datastore.hmset ("test: klucz", czyli) ' ' True' '>>> stored = datastore.hgetall (" test: klucz ")' '>>> stored' ' {b'test ': b'test11'} ' – mezzomondo

+0

samo tutaj, nie działa dla lrange, lub smembers – eugene

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

jeśli używasz pula połączeń, należy przesunąć decode_responses = true do konstruktora pula połączeń.

Powiązane problemy