2017-05-17 8 views
5

PythonコードをRedisサーバーに接続するために、普通のredisパッケージを使用しています。Python-redis keys()は、文字列の代わりにbytesオブジェクトのリストを返します。

私のコードの一部として、文字列オブジェクトが私のRedisサーバーのキーに存在するかどうかをチェックします。何らかの理由

string = 'abcde' 
if string in redis.keys(): 
    do something.. 

、redis.keys()私の文字列は、勿論、strオブジェクトであるが、バイト・オブジェクトとのリスト、など[b'abcde']を返します。

私は既に赤目発生器にcharset,encodingdecode_responsesを設定しようとしましたが、それは役に立たなかったです。

私の目標は、データを文字列として先に挿入し、キーリストを反復処理せずに、各要素をチェックしながらstr()に変更することです。 KEYS操作があなたのRedisのデータベース内のすべてのキーを返し、生産に深刻なパフォーマンスの低下の原因となります

string = 'abcde' 
if redis.exists(string): 
    do something.. 

:あなたが好きEXISTSコマンドを使用し、コードを再構築したほうが良いでしょう先駆け

おかげ

+1

[文字列をPython 3のバイトに変換する最も良い方法は?](http://stackoverflow.com/questions/7585435/best-way-to-convert-string-to-bytes-in) -python-3) –

+0

また、http://stackoverflow.com/questions/25745053 – Bemmu

答えて

6

。副作用としてバイナリから文字列への変換を処理する必要はありません。

あなたは自動的にStrictRedisコンストラクタにdecode_responses引数を使用して文字列にバイトからの応答を変換するために、Redisのクライアントを設定できます。

r = redis.StrictRedis('localhost', 6379, charset="utf-8", decode_responses=True) 

あなたがクライアントとの間charsetオプションと一致していることを確認してください。

+1

ありがとうございます。辞書のキーの値を使用する必要がある場合はどうすればよいですか?バイトの代わりに自動的に文字列に変換する方法はありますか? – GMe

+1

解答をdecode_responsesに関する情報で更新しました。 –

+0

もう一度ありがとうございます。接続プールの中で 'redis.Redis'を使って試しましたが、うまくいきませんでした。' decode_responses'引数に 'StrictRedis'と' redis.Redis'の違いはありますか?私はドキュメントで、両方ともこの引数でうまくいくはずです – GMe

5

デコードのためにリストを反復したくない場合は、自動的にデコードを実行するようにredis接続を設定し、必要な結果を受け取ります。接続文字列では、次のようにdecode_responses引数に注意してください。

rdb = redis.StrictRedis(host="localhost", charset="utf-8", port=6379, db=0, decode_responses=True) 

ハッピーコーディング! :-)

関連する問題