为什么Django的cache.set()存储内容会出现奇怪字符,如何解决?
问题产生原因
Django默认的Redis缓存后端会对所有存入的值做Python pickle序列化处理,你在Redis中看到的\x开头的特殊字符是pickle序列化格式的固定二进制元数据,用于标识序列化对象的类型、版本等信息,并非存储异常。这些元数据仅在Django框架读取缓存时会被自动识别并剔除,直接查询Redis原始值才会显示。
规避方案
分场景选择对应方案即可:
- 仅在Django体系内使用缓存:无需做任何修改,Django读取缓存时会自动完成反序列化,返回的就是你存入的原始字符串,不会存在多余字符。
- 需要支持跨系统直接从Redis读取缓存值:修改Django缓存配置,将序列化器替换为JSON序列化器,配置示例如下(Django 4.0+原生支持,低版本可安装
django-redis扩展实现相同效果):
# settings.py CACHES = { "default": { "BACKEND": "django.core.cache.backends.redis.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { "SERIALIZER": "django.core.cache.serializers.JSONSerializer", } } }
- 不想修改全局配置、仅个别缓存键需要直接在Redis读取:存值时主动将内容转为纯字符串后,直接调用Redis原生客户端写入,不走Django Cache封装的set方法即可。
注意:修改序列化器后,之前通过pickle序列化存入的旧缓存会无法正常反序列化,建议修改配置后清空对应库的旧缓存。
内容的提问来源于stack exchange,提问作者James Lin
相关产品推荐
相关产品推荐

