Есть ли способ установить время истечения срока действия для блокировки кэша Django?

#django #caching #redis #django-cache #django-redis

#django #кэширование #redis #django-cache #django-redis

Вопрос:

У меня есть сервер Django 3.1.3, который использует Redis для своего кэша через django-redis 4.12.1. Я знаю, что блокировки кэша обычно можно установить с помощью следующего:

 with cache.lock('my_cache_lock_key'):
    # Execute some logic here, such as:
    cache.set('some_key', 'Hello world', 3000)
 

Как правило, блокировка кэша снимается, когда with блок завершает выполнение. Однако в моем коде есть некоторая пользовательская логика, которая иногда не снимает блокировку кэша (что хорошо по моим собственным причинам).

Мой вопрос: есть ли способ установить значение тайм-аута для блокировок кэша Django, во многом так же, как вы можете установить тайм-ауты для установки значений кэша ( cache.set('some_key', 'Hello world', 3000) )?

Ответ №1:

Я ответил на свой собственный вопрос. Для cache.lock() :

     def lock(
        self,
        key,
        version=None,
        timeout=None,
        sleep=0.1,
        blocking_timeout=None,
        client=None,
        thread_local=True,
    ):
 

Перекрестная ссылка на это с комментариями из источника Python Redis, который использует те же аргументы:

    ``timeout`` indicates a maximum life for the lock.
    By default, it will remain locked until release() is called.
    ``timeout`` can be specified as a float or integer, both representing
    the number of seconds to wait.
    ``sleep`` indicates the amount of time to sleep per loop iteration
    when the lock is in blocking mode and another client is currently
    holding the lock.
    ``blocking`` indicates whether calling ``acquire`` should block until
    the lock has been acquired or to fail immediately, causing ``acquire``
    to return False and the lock not being acquired. Defaults to True.
    Note this value can be overridden by passing a ``blocking``
    argument to ``acquire``.
    ``blocking_timeout`` indicates the maximum amount of time in seconds to
    spend trying to acquire the lock. A value of ``None`` indicates
    continue trying forever. ``blocking_timeout`` can be specified as a
    float or integer, both representing the number of seconds to wait.
 

Поэтому, чтобы установить максимальный период времени в 2 секунды, на который вступает в силу блокировка кэша, сделайте что-то вроде этого:

 with cache.lock(key='my_cache_lock_key', timeout=2):
    # Execute some logic here, such as:
    cache.set('some_key', 'Hello world', 3000)