#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'
}
}