Python-redis keys()返回字节对象列表而不是字符串

GMe*_*GMe 17 python redis

我正在使用常规redis包来将我的Python代码连接到我的Redis服务器.

作为我的代码的一部分,我检查我的Redis服务器密钥中是否存在字符串对象.

string = 'abcde'
if string in redis.keys():
  do something..
Run Code Online (Sandbox Code Playgroud)

出于某些原因,redis.keys()返回一个包含字节对象的列表,例如[b'abcde'],而我的字符串当然是一个str对象.

我已经尝试设置charset,encodingdecode_responses在我的redis生成器中,但它没有帮助.

我的目标是将数据作为字符串向前插入,而不是遍历键列表并在检查时将每个元素更改为str().

谢谢你

Tag*_*ith 28

您最好使用EXISTS命令并重构您的代码,例如:

string = 'abcde'
if redis.exists(string):
    do something..
Run Code Online (Sandbox Code Playgroud)

KEYS操作返回Redis数据库中的每个键,并将导致生产中性能严重下降.作为副作用,您可以避免必须处理二进制到字符串转换.

您可以将Redis客户端配置为使用构造函数的decode_responses参数自动将响应从字节转换为字符串StrictRedis:

r = redis.StrictRedis('localhost', 6379, charset="utf-8", decode_responses=True)
Run Code Online (Sandbox Code Playgroud)

确保您与charset客户之间的选项一致.

  • `charset=utf-8` 是错误的,原因有两个。首先,“charset”参数已被弃用,如果您使用它,您会收到警告。它已被替换为“encoding”参数。其次,“encoding”参数默认为“utf-8”,因此根本不需要设置它。 (2认同)

Ran*_*PhD 13

如果您不希望迭代列表进行解码,请将redis连接设置为自动执行解码,您将收到所需的结果.如下连接字符串中,请注意decode_responses参数:

rdb = redis.StrictRedis(host="localhost", port=6379, db=0, decode_responses=True)
Run Code Online (Sandbox Code Playgroud)

快乐的编码!:-)


use*_*707 7

前面的答案是正确的,因为decode_responses需要连接参数来自动执行此操作,他们忽略的是,如果使用连接池建立连接,则需要在 ConnectionPool 上设置它。下面的代码片段会将所有客户端上的“decode_responses”值设置为 true,即使客户端在连接期间将自身设置为 False

pool = redis.ConnectionPool(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB, password=REDIS_PWD, decode_responses=True)
Run Code Online (Sandbox Code Playgroud)


Muh*_*eed 7

一种解决方案可以是:

解码redis密钥

print(key)
#output is : b'some_key'

print(key.decode())
#output is : 'some_key'
Run Code Online (Sandbox Code Playgroud)

更新 :

将字典对象传递给 RedisPost 类,然后解码单个项目并将它们存储为一个对象。

class RedisPost():
   def __init__(self, dic):
      for k,v in dic.items():
          if not isinstance(k,int):
             var = k.decode()
             setattr(self,var,v.decode())


my_dic = {'a':12, 'b':123}
obj = RedisPost(my_dic)
print(obj.a) # output will be 12 
Run Code Online (Sandbox Code Playgroud)