Какой подход лучше для кэширования данных в приложении django при работе на gunicorn

У меня есть приложение django, которое работает на сервере приложений gunicorn. Gunicorn запускает N рабочих серверов. Мы знаем, что каждый рабочий - это отдельный python-процесс. В одном из сервисов моего приложения есть запрос к базе данных, который занимает много времени (10-20 секунд).

Ок я решил кэшировать результат, поэтому просто добавляю django.core.cache и вызываю cache.get(key) если результат не None приложение возвращает данные из кэша, если нет, то вызывает сервис и сохраняет данные в кэше с помощью cache.set(key, data, time). Но если у нас N рабочих и первый запрос был адресован рабочему 0, приложение сохранило результат долго работающего сервиса в кэше (памяти процесса) рабочего 0, но когда аналогичный (запрос содержит опцию подкачки, но я храню весь RawDataSet в памяти, поэтому каждая страница возвращается быстро) запрос адресован рабочему 1, кэш, как ожидалось, не будет работать, потому что это другой процесс. Поэтому, очевидно, мне нужно использовать какой-то кэш, который мог бы использоваться всеми рабочими.

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

Я бы использовал REDIS (In Memory Database) для хранения результатов SQL и разделения их между N работниками.

Я решил эту проблему с помощью пакета django-redis, главное преимущество этого решения в том, что вам не нужно менять код и по-прежнему использовать cache.get() и cache.set() функции из django.core.cache, вам просто нужно добавить специфические настройки кэша redis в файл настроек следующим образом:

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/12',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient'
        },
        'KEY_PREFIX': 'text_analyzer'
    }
}

Вернуться на верх