Не сериализуйте и не сериализуйте (не удаляйте и не удаляйте) данные во время чтения и записи из redis

#django #python-3.x #django-redis

#django #python-3.x #django-redis

Вопрос:

Я работаю в системе, в которой несколько кодовых баз обращаются к одному и тому же экземпляру 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 пытается де-сериализовать (отменить выделение) данные, хотя данные даже не сериализованы (не выделены). Могу ли я отключить это маринование и отключение в django-redis

Комментарии:

1. вам нужно поделиться кодами, касающимися травления и удаления, без которых мы не сможем вам помочь

2. на самом деле я не использую свой собственный алгоритм для того же, я использую django framework, в котором это уже реализовано.

Ответ №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",
        }
    }
}