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]