Redis使用set()存储dict类型值触发DataError的解决问询
解决Redis存储字典时的DataError异常
Redis的set方法仅支持存储bytes、string、int或float类型的值,直接传入Python字典会触发DataError——因为字典不属于Redis支持的原生值类型。解决核心是先将字典序列化为字符串或字节流,读取时再反序列化回字典。
方案1:使用JSON序列化(推荐,跨语言兼容)
JSON是通用数据格式,序列化后的内容可被其他编程语言解析,适合多语言协作场景:
import redis import json r = redis.Redis() value = 180 my_dict = dict(bar=value) # 序列化字典为JSON字符串并存入Redis r.set('foo', json.dumps(my_dict)) # 读取并反序列化回字典 retrieved_bytes = r.get('foo') if retrieved_bytes: my_dict = json.loads(retrieved_bytes) print(my_dict) # 输出: {'bar': 180}
方案2:使用Pickle序列化(Python专属)
Pickle可以序列化几乎所有Python对象,但仅能在Python环境中解析,且存在安全风险(禁止反序列化未知来源的数据):
import redis import pickle r = redis.Redis() value = 180 my_dict = dict(bar=value) # 序列化字典为字节流并存入Redis r.set('foo', pickle.dumps(my_dict)) # 读取并反序列化回字典 retrieved_bytes = r.get('foo') if retrieved_bytes: my_dict = pickle.loads(retrieved_bytes) print(my_dict) # 输出: {'bar': 180}
额外建议
如果只是存储键值对结构的数据,也可以直接使用Redis的Hash类型(hset/hgetall方法),无需序列化:
import redis r = redis.Redis() value = 180 r.hset('foo', 'bar', value) retrieved_dict = r.hgetall('foo') # 注意:hgetall返回的字节键值对,可按需解码 print({k.decode(): int(v.decode()) for k, v in retrieved_dict.items()}) # 输出: {'bar': 180}
内容的提问来源于stack exchange,提问作者DanielBell99
相关产品推荐
相关产品推荐

