这里记录一下个人在项目中遇到的小坑
在python中将对象序列化并缓存在redis中,我一开始是这样写的
def demo():
my_list = [1, 2, 3] # 定义被序列化的对象
cache.hset('name', 'key', pickle.dumps(my_list)) # 序列化列表并缓存到redis
my_list2 = pickle.loads(self.cache.hget('name', 'key')) # 读取redis并反序列化
print(my_list2)
上述代码看起来好像是没问题的,也确实在redis中缓存成功了,在redis连接工具中能看到具体的值,但是取值却报错
{UnicodeDecodeError}'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
这个问题,我在网上查询了大量资料之后发现,需要指定编码,再缓存到redis,取值之后编码再反序列化才OK
def demo():
my_list = [1, 2, 3] # 定义被序列化的对象
cache.hset('name', 'key', pickle.dumps(my_list).decode('latin1')) # 序列化列表并缓存到redis
my_list2 = pickle.loads(self.cache.hget('name', 'key').decode('latin1')) # 读取redis并反序列化
print(my_list2)
运行结果
[1, 2, 3]