【问题标题】:Don't serialize and unserialize (Pickle and Unpickle) the data while reading and writing from redis从 redis 读写时不要序列化和反序列化(Pickle 和 Unpickle)数据
【发布时间】:2019-09-05 05:55:42
【问题描述】:

我在一个系统中工作,其中多个代码库访问同一个 redis 实例,因此在 django 框架中读取从其他代码库写入的一些数据时,我收到以下错误。

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3.5/dist-packages/django_redis/cache.py", line 32, in _decorator
    return method(self, *args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/django_redis/cache.py", line 81, in get
    client=client)
  File "/usr/local/lib/python3.5/dist-packages/django_redis/client/default.py", line 210, in get
    return self.decode(value)
  File "/usr/local/lib/python3.5/dist-packages/django_redis/client/default.py", line 318, in decode
    value = self._serializer.loads(value)
  File "/usr/local/lib/python3.5/dist-packages/django_redis/serializers/pickle.py", line 35, in loads
    return pickle.loads(value)
_pickle.UnpicklingError: invalid load key, '{'.

基本上 Django 试图反序列化(unpickle)数据,尽管数据甚至没有序列化(pickeled)。我可以在 django-redis 中关闭这个酸洗和取消酸洗吗

【问题讨论】:

  • 你需要分享酸洗和解酸的代码,没有这些我们帮不了你
  • 实际上我并没有使用我自己的算法,我使用的是已经实现的 django 框架。

标签: django python-3.x django-redis


【解决方案1】:

您可以通过 django 缓存选项控制序列化行为。尝试将缓存序列化程序更改为 JSONSerializer 或 DummySerializer。

例如,如果您使用的是 django-redis-cache 包,请将缓存设置更改为:

CACHES = {
    'default': {
        'BACKEND': ...,
        'LOCATION': ...,
        'OPTIONS': {
            'SERIALIZER_CLASS': 'redis_cache.serializers.JSONSerializer',
            ...
        },
        ...
    }
}

请注意,如果您使用的是django-redis 包,则选项的键和值会有所不同:

CACHES = {
    "default": {
        "BACKEND": ...,
        "LOCATION": ...,
        "OPTIONS": {
            ...
            "SERIALIZER": "django_redis.serializers.json.JSONSerializer",
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-08-28
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2012-03-17
    相关资源
    最近更新 更多