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

时间:2017-05-17 13:37:47

标签: python redis

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

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

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

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

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

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

提前致谢

4 个答案:

答案 0 :(得分:19)

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

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

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

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

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

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

答案 1 :(得分:12)

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

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

快乐的编码! : - )

答案 2 :(得分:5)

一种解决方案可以是:

解码redis密钥

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

print(key.decode())
#output is : 'some_key'

已更新:

将字典对象传递给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 

答案 3 :(得分:2)

先前的答案是正确的,因为自动执行此操作需要使用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)