Какой лучший подход к кэшированию данных в приложении django при запуске на gunicorn

#django #caching #gunicorn

Вопрос:

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

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

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

Ответ №1:

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

Ответ №2:

Я решил эту проблему с помощью пакета 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'
    }
}