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)
。