Кэш базы данных Django TIMEOUT - заставить бэкэнд удалить строку

Я не уверен, что кэш базы данных Django делает с записями с истекшим сроком действия, но кажется, что они остаются в базе данных.

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

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'cache_table',
        'TIMEOUT': 60 * 20,
    }
}

Я использую cache в отфильтрованном списке объектов, и этот фильтр содержит числовые и символьные поля.

Является ли это возможным?


person Milano    schedule 11.11.2018    source источник


Ответы (1)


Невозможно очистить записи с истекшим сроком действия по мере их истечения. Это одна из многих причин, по которой вы, вероятно, не хотите использовать кеш базы данных в рабочей среде!

Если возможно, вам следует переключиться на другой сервер кэширования (я предпочитаю Redis). Если вы не можете, у вас есть несколько других вариантов:

  1. Если вы знаете ключи кеша, которые хотите очистить, вы можете использовать API низкоуровневого кэша для прямого удаления ключей, которые вы хотите очистить.

  2. Вы можете настроить MAX_ENTRIES и/или CULL_FREQUENCY аргументы кэша чтобы ограничить общий размер кэша.

  3. Вы можете напрямую войти в базу данных (возможно, из фоновой задачи или задания cron), вручную запустив какой-нибудь SQL, например DELETE FROM cache_table WHERE expires < now() (я не проверял это, но думаю, что это должно работать).

person jacobian    schedule 11.11.2018
comment
Кажется, стоит отметить, что, хотя строки обычно не удаляются каким-либо фоновым процессом, параметр timeout работает. Он работает только при чтении кеша. Я не уверен, удаляются ли строки в этот момент, если срок их действия истек или нет, но ваш клиент получит None, если он попытается get() удалить запись в кэше с истекшим сроком действия. Я только что обновил документы, добавив некоторую информацию по этому поводу. - person mlissner; 30.07.2020