Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python redis keys()返回字节对象列表,而不是字符串_Python_Redis - Fatal编程技术网

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

Python redis keys()返回字节对象列表,而不是字符串,python,redis,Python,Redis,我使用常规的redis包将Python代码连接到redis服务器 作为代码的一部分,我检查Redis服务器密钥中是否存在字符串对象 string = 'abcde' if string in redis.keys(): do something.. 由于某些原因,redis.keys()返回一个包含字节对象的列表,例如[b'abcde'],而我的字符串当然是str对象 我已经尝试在我的redis生成器中设置字符集,编码和解码,但没有任何帮助 我的目标是在前面以字符串形式插入数据,而不是在键

我使用常规的
redis
包将Python代码连接到redis服务器

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

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

我已经尝试在我的redis生成器中设置
字符集
编码
解码
,但没有任何帮助

我的目标是在前面以字符串形式插入数据,而不是在键列表上迭代,并在检查时将每个元素更改为str()


感谢大家

您可以配置Redis客户端,使用
decode\u responses
参数将响应从字节自动转换为字符串,并将其转换为
StrictRedis
构造函数:

r = redis.StrictRedis('localhost', 6379, charset="utf-8", decode_responses=True)
确保客户端之间的
字符集
选项一致

注意

您最好使用以下命令并重新构造代码:

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

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

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

rdb = redis.StrictRedis(host="localhost", port=6379, db=0, decode_responses=True)
快乐编码!:-)
(2019年11月13日修订)

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

pool = redis.ConnectionPool(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB, password=REDIS_PWD, decode_responses=True)

一种解决方案可以是:

解码redis密钥

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

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

将dictionary对象传递到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 

这也回答了你的问题吗?谢谢如果我需要使用dictionary键的值呢?如何将其自动转换为字符串而不是字节?我用有关解码响应的信息更新了答案。再次感谢。我用连接池中的redis.redis尝试了这个,但效果不好。。
decode\u responses
参数中的
StrictRedis
redis.redis
之间有什么区别吗?我在文档中发现,它们都可以使用此参数adding decode_responses=True仅在我将其添加到ConnectionPool初始化而不是StrictRedis初始化时对我有效。连接池=redis.ConnectionPool(主机=redis\u主机,端口=redis\u端口,密码=redis\u密码,解码响应=True)redis\u db=redis.StrictRedis(连接池=connection\u池,charset='utf-8')
charset=utf-8
有两个原因是错误的。首先,
charset
参数已被弃用,如果您使用它,将收到警告。它已替换为
编码
参数。其次,
encoding
参数的默认值是
utf-8
,因此根本不需要设置它。您有没有可以在答案中显示的示例你应该把它包括在内,让人们知道你的意思。嗨,我冒昧地删除了你的部分答案,这与手头的问题无关,回答老问题没有任何问题。谢谢!添加decode_responses=True仅在我将其添加到ConnectionPool初始化而不是StrictRedis初始化时对我有效。连接池=redis.ConnectionPool(主机=redis\u主机,端口=redis\u端口,密码=redis\u密码,解码响应=True)redis\u db=redis.StrictRedis(连接池=连接池,charset='utf-8')这不起作用。顺便说一句,“字符集”已被弃用。改为使用“编码”。@zzxwill-mods已生成!这太酷了!虽然我期望的大多数结果都是字符串,但我有一小部分查询希望覆盖此设置并实际获取字节。有没有办法从现有连接中获得“派生”连接?例如,
rdb2=rdb.copy(decode\u responses=False)
或类似内容?回答我自己的“评论中的问题”。。。我们可以从
kwold=rdb.connection\u pool.connection\u kwargs
获取当前的连接参数,并在mods之后创建一个新的连接,如
kwnew={**kwold,**kwargs}
rdbnew=redis.StrictRedis(**kwnew)