2014-04-23 15 views
6

Tôi chơi xung quanh với microframework bình, và muốn cache một số số liệu thống kê trong redis. Hãy nói rằng tôi có dict này:hành vi redis-py và hgetall

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

tôi lưu nó vào redis với

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

Tuy nhiên sau khi khôi phục

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

tôi thấy lạ {b'test': b'test11'} nên stored.get("test") mang lại cho tôi Không

mydict kết quả phương pháp str có vẻ tốt {'test': 'test11'}. Vì vậy, tại sao điểm đánh dấu nhị phân này được thêm vào dữ liệu được khôi phục? Tôi cũng đã kiểm tra trong redis-cli và không thấy dấu hiệu b rõ ràng ở đó. Có gì sai với hgetall?

+1

Nếu ai đó quan tâm, đây là câu trả lời từ nhà phát triển: https://github.com/andymccurdy/redis-py/issues/463#issuecomment-41229918 – Tommi

Trả lời

12

Đây là hành vi dự định. Theo mặc định, các chuỗi sắp ra khỏi Redis không được giải mã. Bạn có một vài tùy chọn:

  • Tự giải mã dữ liệu.
  • Tạo phiên bản ứng dụng khách với đối số decode_responses, ví dụ: StrictRedis(decode_responses=True). Điều này sẽ giải mã tất cả các chuỗi đến từ Redis dựa trên đối số charset (mặc định là để utf-8). Chỉ làm điều này là bạn chắc chắn mọi phản hồi từ Redis có dữ liệu chuỗi mà bạn muốn giải mã thành utf-8. Nếu bạn đang sử dụng cùng một phiên bản ứng dụng khách để nhận dữ liệu nhị phân như đối tượng được chọn, bạn không được sử dụng tùy chọn này. Trong trường hợp đó, tôi khuyên bạn nên sử dụng một cá thể khách hàng riêng biệt cho dữ liệu nhị phân.

Nguồn: https://github.com/andymccurdy/redis-py/issues/463#issuecomment-41229918

+1

Đối số này không có giấy tờ và dường như không hoạt động: 'python3' ' >>> nhập redis' '>>> POOL = redis.ConnectionPool (máy chủ = 'localhost', cổng = 6379, db = 0)' '>>> datastore = redis.StrictRedis (connection_pool = POOL, decode_responses = True) ' ' >>> mydict = {} ' ' >>> mydict ["test"] = "test11" ' ' >>> datastore.hmset ("test: key", mydict) ' ' True' '>>> được lưu trữ = datastore.hgetall (" test: key ")' '>>> được lưu trữ ' ' {b'test': b'test11 '} ' – mezzomondo

+0

tương tự ở đây, không hoạt động cho lrange, hoặc smembers – eugene

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

nếu bạn sử dụng ConnectionPool, bạn nên di chuyển decode_responses = Đúng như các nhà xây dựng của ConnectionPool.