Copy
Как закэшировать нужное
View this email in your browser

Привет!

В эти выходные контрольная точка по бизнес-логике. Не забудьте всё сделать и перенести карточку в Trello на проверку.

В этом письме: анонс стажировки в IPONWEB, как организовать кэширование.


Анонс стажировки

Надеюсь, вы та самая целевая аудитория для этого объявления. Я поговорил с нашими HR, рассказал, насколько вы классные студенты, и кажется, IPONWEB готов помочь вам провести лето в крутой (на мой субъективный взгляд) технологической компании.

Мы занимаемся тем, что строим системы для автоматического анализа рекламы и RTB. Скорее всего, вы особо не слышали про IPONWEB, но почти весь (85%) рекламный трафик RTB Европы, США и Японии проходит через наши сервисы. Если кто пропустил, можете посмотреть рассказ Олега Тишутина.

Что у нас ещё мне нравится как бонус к интересной работе:

  • Компания международная, поэтому вся переписка на английском (можно учить новые слова и программистские фразеологизмы), но в московском офисе устно общаются на русском.
  • Я не встречал у нас неинтересных людей, что было обычным явлением в других компаниях, нередко можно на кухне попасть на обсуждение какой-нибудь мозговскрывающей задачи по терверу или обсуждение технических подробностей самолетостроения (но, конечно, без политики тоже не обходится). При этом компания пока не очень большая и уютна, но уже достаточно крупная, чтобы почти под любое редкое хобби найти единомышленников среди коллег.
  • Офис оформляла та же компания, что и Яндексу. Я люблю ходить на собеседования просто так и всегда вижу корреляцию между тем, насколько офис комфортен, и тем, насколько хорошо организована разработка. У нас всё ОК. Находится офис в минуте ходьбы от метро Шаболовская (это почти центр, в 10 минутах ходьбы ПГ и Нескучный сад).
Сейчас нужно примерно знать, скольким из вас это интересно, так что заполните форму, а то может уже все нашли себе чем заняться летом.


Кэширование

Одним из требований прохождения ближайшей контрольной точки является использование кэширования. Кэширование в веб-сервисах обычно используется, чтобы сохранить результаты какого-то запроса, который часто выполняется и лезть в базу реже. Для онлайн-магазинов обычно кэшируются запросы для главной страницы каталога, иногда корзин пользователей. В остальных приложениях можно кэшировать то, что считывается намного чаще, чем меняется, при это запрос данных нетривиален (например, не нужно кэшировать запросы из базы по первичному ключу). В вашем проекте может не понадобиться кэшировать что-либо, поэтому, если сомневаетесь, спросите ментора.

Кэширование реализуется как правило простым key-value хранилищем, а веб-приложение прежде чем выполнить запрос проверяет, есть ли уже его результаты в кэше? Если есть, то просто берет, а если нет, то считает и добавляет в кэш результаты, чтобы в следующий раз к ним обратиться.

Django, как вы помните, фреймворк, а значит в нем уже должно быть реализовано многое для организации кеширования. Подробное описание вариантов организации кеширования доступно в документации.
 

Установка memcached

Для разработки это необязательно, так как в Django есть вариант попроще, но, чтобы вы знали, в реальных условиях обычно выбор отдается в пользу memcached.

Для использования самого популярного сервиса для кэша memcached, нужно этот сервис поставить и убедиться, что он работает. Для Debian-систем всё просто:

sudo apt-get install memcached
service memcached status

Выводит, если всё хорошо:      
 * memcached is running

Для других систем соберите приложение самостоятельно.

И также нужен драйвер для работы с этим сервером, который называется python-memcached.
 

Настройка кэширования

Настройки кэширования можно задать в settings.py блоком CACHES. Если у вас локально запущен сервер memcached, то достаточно добавить

CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', } }

На время разработки можно использовать простое и менее эффективное кэширование в памяти, которое ожидаемо уже реализовано в Django:

CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', } }

В этом варианте, если вы остановите сервер, то весь кэш очистится.
 

Использование кэширования

У Django есть несколько вариантов использования кеширования. Среди них:

  • глобальный для всего сайта - в случае успешного HTTP-ответа, страница кэшируется и в следующий раз по этому же адресу будет браться готовой из кэша
  • кэширование представления - декоратор над методами во views.py, который делает то же самое, но вы указываете, для каких именно запросов

Оба эти метода хороши тем, что не требуют настройки и удобны для статических сайтов. Но статические сайты лучше писать не на Django, а на чем-нибудь типа Pelican.

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

Чтобы пользоваться кэшем, достаточно импортировать:

from django.core.cache import cache

А после этого работать с cache почти как со словарем:

  • cache.set('products', Product.objects.all()) - установить значение в ключ
  • cache.set('products', Product.objects.all(), 10) - установить значение в ключ, но ключ через 10 секунд удалится
  • cache.get('products') - получить данные по ключу, если данных нет, то вернется None
  • cache.get('products', Product.objects.all()) - то же, но если данных нет, то выполнится запрос
  • cache.get_or_set('products', Product.objects.all(), 10) - гвоздь программы - готовый однострочник использования кэша: если ключа "products" нет, то выполнится запрос и его результат запишется в ключ "products", а сам ключ будет доступен еще 10 секунд


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

На этом всё: достаточно добавить три строчки и вы уже начинающий специалист по высоким нагрузкам с опытом (не сарказм). Более важно, конечно, правильно выбрать, что и как кэшировать. Если вы хотите закэшировать корзину, чтобы показывать ее на всех страницах пользователю, то при добавлении в нее покупок явно укажите, что и значение в кэше нужно обновить. И также важно, чтобы ключ содержал идентификатор корзины, и каждый посетитель получал бы свою корзину, а не закэшированную чужую.

Успехов вам! Вот красная панда (a.k.a red bear-cat) желает вам всё доделать в срок.
Sincerely yours,
Ivan Savin

Want to change how you receive these emails?
You can update your preferences or unsubscribe from this list
 






This email was sent to <<Email Address>>
why did I get this?    unsubscribe from this list    update subscription preferences
HSE Projects · ул. Мясницкая, дом 20 · Москва 101000 · Russia

Email Marketing Powered by MailChimp