我正在使用常规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,encoding并decode_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客户之间的选项一致.
Ran*_*PhD 13
如果您不希望迭代列表进行解码,请将redis连接设置为自动执行解码,您将收到所需的结果.如下连接字符串中,请注意decode_responses参数:
rdb = redis.StrictRedis(host="localhost", port=6379, db=0, decode_responses=True)
Run Code Online (Sandbox Code Playgroud)
快乐的编码!:-)
前面的答案是正确的,因为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)
一种解决方案可以是:
解码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)
| 归档时间: |
|
| 查看次数: |
12908 次 |
| 最近记录: |