记录一下那天晚上的排查过程。把多轮历史存 Redis 时直接 json.dumps(messages),消息里带 created_at 的 datetime 对象,报 TypeError: Object of type datetime is not JSON serializable,服务降级成内存存储后重启丢了历史。

刚开始盯着「反序列化时没把字符串转回时间」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。datetime 不是 JSON 原生支持的类型。也可能是把 ORM 对象直接塞进了历史。

少数情况下是多个服务对时间格式的约定不一致。

序列化时指定默认转换

python session_store.py --default isoformat

再往下读取时统一解析回时间

python session_store.py --parse-iso

然后用 pydantic 模型承担类型转换

python session_store.py --pydantic

剩下的就是写入后读回验证字段类型

python -c "import json;d=json.load(open('msg.json'));print(type(d['created_at']))"

白天有业务在跑,能验证的部分都压到了晚上做。

别只看报错消失,验证要多做一步。历史能正常写入 Redis 并读回,时间字段是 datetime 且时区一致,服务重启后会话还在。

这里还有个坑。历史结构的序列化协议要提前定好,时间统一用带时区的 ISO 字符串,比事后兼容各种格式省事。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189