19

私はフラスコのマイクロフレームワークをいじり、いくつかの統計を Redis にキャッシュしたいと考えました。私がこの口述を持っているとしましょう:

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

私はそれをredisに保存しました

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

ただし、復元後

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

私は奇妙に見える{b'test': b'test11'}のでstored.get("test")、私にNoneを与えます

mydictstr メソッドの結果は問題ないよう{'test': 'test11'}です。では、なぜこのバイナリ マーカーが復元されたデータに追加されたのでしょうか? redis-cli もチェックインしましたが、そこに明示的な b マーカーが表示されません。hgetall に何か問題がありますか?

4

3 に答える 3

28

これは意図した動作です。デフォルトでは、Redis から出力される文字列はデコードされません。いくつかのオプションがあります。

  • 自分でデータをデコードします。
  • decode_responsesなどの引数を使用してクライアント インスタンスを作成しますStrictRedis(decode_responses=True)charsetこれは、引数 (デフォルトは utf-8) に基づいて、Redis から来るすべての文字列をデコードします。これを行うのは、Redis からのすべての応答に、utf-8 にデコードしたい文字列データが含まれていることが確実な場合のみです。ピクルされたオブジェクトなどのバイナリ データを取得するために同じクライアント インスタンスを使用している場合は、このオプションを使用しないでください。その場合、バイナリ データ用に別のクライアント インスタンスを使用することをお勧めします。

ソース: https://github.com/andymccurdy/redis-py/issues/463#issuecomment-41229918

于 2014-09-21T10:05:18.927 に答える
9
POOL = redis.ConnectionPool(host='localhost', **decode_responses=True**, port=6379, db=0)
datastore = redis.StrictRedis(connection_pool=POOL)

ConnectionPool を使用する場合は、decode_responses=True を ConnectionPool のコンストラクターに移動する必要があります。

于 2017-02-22T05:27:23.547 に答える