web-dev-qa-db-fra.com

Python-redis keys () retourne une liste d'objets octets au lieu de chaînes

J'utilise le package régulier redis afin de connecter mon code Python à mon serveur Redis.

Dans le cadre de mon code, je vérifie si un objet chaîne existe dans mes clés de serveur Redis.

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

Pour certaines raisons, redis.keys () renvoie une liste avec des objets octets, tels que [b'abcde'], alors que ma chaîne est, bien sûr, un objet str.

J'ai déjà essayé de définir charset, encoding et decode_responses dans mon générateur redis, mais cela n'a pas aidé.

Mon objectif est d'insérer les données sous forme de chaîne à l'avance, de ne pas parcourir la liste des clés et de changer chaque élément en str () tout en le vérifiant.

Merci d'avance

14
GMe

Vous feriez mieux d'utiliser la commande EXISTE et de restructurer votre code comme:

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

L'opération KEYS renvoie toutes les clés de votre base de données Redis et entraînera une sérieuse dégradation des performances en production. En tant qu'effet secondaire, vous évitez d'avoir à gérer la conversion du binaire en chaîne.

Vous pouvez configurer le client Redis pour convertir automatiquement les réponses d'octets en chaînes à l'aide de decode_responses argument au constructeur StrictRedis:

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

Assurez-vous que vous êtes cohérent avec l'option charset entre les clients.

23
Tague Griffith

Si vous ne souhaitez pas parcourir la liste pour le décodage, définissez votre connexion redis pour effectuer automatiquement le décodage et vous recevrez le résultat requis. Comme suit dans votre chaîne de connexion, veuillez noter l'argument decode_responses:

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

Codage heureux! :-)

14
RandallShanePhD

Les réponses précédentes sont correctes en ce que le decode_responses le paramètre de connexion est nécessaire pour le faire automatiquement, ce qu'ils omettent, c'est qu'il doit être défini à la place sur le ConnectionPool si les connexions sont établies à l'aide du pool. L'extrait ci-dessous définira la valeur 'decode_responses' sur tous les clients sur true, même si le client se définit sur False lors de la connexion

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