Какой подход лучше для кэширования данных в приложении 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'
}
}