我正在使用常规redis
包来将我的Python代码连接到我的Redis服务器。
作为我的代码的一部分,我检查我的Redis服务器密钥中是否存在字符串对象。
string = 'abcde'
if string in redis.keys():
do something..
由于某些原因,redis.keys()返回一个包含字节对象的列表,例如[b'abcde']
,而我的字符串当然是str
对象。
我已经尝试在我的redis生成器中设置charset
,encoding
和decode_responses
,但它没有帮助。
我的目标是将数据作为字符串向前插入,而不是遍历键列表并在检查时将每个元素更改为str()。
提前致谢
答案 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)