web-dev-qa-db-ja.com

Python-redis keys()は、文字列ではなくバイトオブジェクトのリストを返します

PythonコードをRedisサーバーに接続するために、通常のredisパッケージを使用しています。

コードの一部として、文字列オブジェクトがRedisサーバーキーに存在するかどうかを確認します。

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

何らかの理由で、redis.keys()は[b'abcde']などのバイトオブジェクトのリストを返しますが、私の文字列はもちろんstrオブジェクトです。

私はすでにcharsetencodingおよびdecode_responsesをredisジェネレーターに設定しようとしましたが、助けにはなりませんでした。

私の目標は、データを文字列として先に挿入し、キーリストを反復処理せずに、チェック中に各要素をstr()に変更することです。

先に感謝します

14
GMe

[〜#〜] exists [〜#〜] コマンドを使用して、コードを次のように再構築した方が良いでしょう。

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

KEYS操作は、Redisデータベース内のすべてのキーを返し、本番環境で深刻なパフォーマンスの低下を引き起こします。副作用として、バイナリから文字列への変換を処理する必要がなくなります。

StrictRedisコンストラクターのdecode_responses引数を使用して、応答をバイトから文字列に自動的に変換するようにRedisクライアントを構成できます。

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

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

23
Tague Griffith

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

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

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

14
RandallShanePhD

以前の回答は、decode_responses接続パラメーターは、これを自動的に行うために必要です。彼らが省略しているのは、接続がプールを使用して行われる場合、代わりにConnectionPoolで設定する必要があるということです。以下のスニペットは、接続中にクライアントが自身をFalseに設定した場合でも、すべてのクライアントの 'decode_responses'値をtrueに設定します

pool = redis.ConnectionPool(Host=REDIS_Host, port=REDIS_PORT, db=REDIS_DB, password=REDIS_PWD, decode_responses=True)
2
user1596707