Сбой блокировки Django_redis с UnpicklingError
В одном месте моего кода я использую django_redis для обновления кэша с блокировкой:
from django.core.cache import cache
with cache.lock('hello'):
# do stuff
В другом месте я проверяю, не заблокирован ли кеш, используя:
if not cache.get('hello'):
# do other stuff
Тем не менее, когда блокировка установлена, get
вызов не удался с UnpicklingError: invalid load key, 'f'.
Почему это происходит? Что я делаю неправильно?
Вы можете воспроизвести это поведение с помощью этого фрагмента:
from django.core.cache import cache
with cache.lock('hello'):
cache.get('hello')
1 ответ
Это не очень очевидно, но, как я понимаю, ваш lock_key
а также cache_key
не должно быть одинаковым. например этот код:
cache_key = 'hello'
with cache.lock(cache_key):
cache.get(cache_key)
повышение UnpicklingError: invalid load key...
,
В то же время этот код:
cache_key = 'hello'
lock_key = cache_key + '_lock'
with cache.lock(lock_key):
cache.get(cache_key)
работает как хочешь.