You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 12:30:54