记录一下那天晚上的排查过程。把多轮历史存 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 字符串,比事后兼容各种格式省事。这类问题最好一次改到位,反复小改反而容易把原因搅混。
