Python的Pickle+Redis序列化与反序列化爬坑小记

Python的Pickle+Redis序列化与反序列化爬坑小记

这里记录一下个人在项目中遇到的小坑

在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]

你可能感兴趣的:(python,reids)