Содержание
Данная глава временно взята из первой версии книги и подлежит корректировке. Вы можете помочь с этим!
Перевод © Попов Руслан <radz • yandex • ru>
Статические веб сайты, которые являются простыми файлами отсылаемыми по сети, растут как сумасшедшие. Но важное преимуществу динамических сайтов заключается в их динамике. При каждом пользовательском запросе страницы, веб сервер выполняет необходимые действия — от выполнения запросов над базой данных, до обработки шаблона по имеющейся бизнес-логике — для создания этой страницы. С точки зрения экономии ресурсов, это весьма расточительная работа.
Для большинства веб приложений такое расточительство не является критичным. Большинство веб приложений не похожи на http://washingtonpost.com/ или на SlashDot, это небольшие сайты со скромным трафиком. Но для более серьёзных сайтов желательно внимательно относится к экономии ресурсов. Этому поможет кэширование.
Процесс кэширования — это процесс сохранения результата ресурсоёмкого вычисления, для исключения повторной траты ресурсов на такое же действие в будущем. Ниже представлен некий псевдокод, который объясняет как это будет работать для динамически созданной веб страницы:
получен URL, пытаемся найти такую страницу в кэше
если страница есть в кэше:
возвращаем закэшированную страницу
иначе:
создаём страницу
сохраняем её в кэше на будущее
возвращаем созданную страницу
Django поставляется с надёжной системой кэширования, которая позволяет вам сохранять динамические страницы, что помогает сэкономить ресурсы при повторных запросах. Для удобства Django предоставляет различные уровни детализации кэша. Вы можете кэшировать отклики определённых представлений, либо только трудновоспроизводимые части, или вы можете кэшировать весь сайт.
Django хорошо работает с кэшами высокого уровня, такими как Squid (http://www.squid-cache.org/ и кэши браузеров. Существуют типы кэшей, которые вы не можете контролировать напрямую, но которым можно отсылать инструкции (через HTTP заголовки), указывая какая часть вашего сайта должна быть закэширована и как.
Продолжайте читать, чтобы узнать как использовать систему кэширования в Django. Когда ваш сайт станет подобным Slashdot'у, вы похвалите себя за то, что поняли этот материал.
Система кэширования практически не нуждается в настройке. А именно, следует указать где должен располагаться кэш: в базе данных, на файловой системе или прямо в оперативной памяти. Это важное решение, которое повлияет на производительность кэша (да, некоторые типы кэша значительно быстрее работают чем другие). Производительность кэширования в памяти обычно значительно выше, чем в случае базы данных или файловой системы, так как в этом случае исключаются затраты на взаимодействие с базой данных или файловой системой.
Настройка кэша производится через параметр CACHE_BACKEND файла конфигурации. Если вы используете кэширование и не указали CACHE_BACKEND, Django будет по умолчанию использовать simple:///. Следующие секции расскажут о всех возможных значениях данного параметра.
Безусловно самый быстрый и самый эффективный тип кэша доступный Django — Memcached — является средой кэширования в оперативной памяти, разработанной для управления высокой нагрузкой на сервис LiveJournal (http://www.livejournal.com/ и впоследствии открытый компанией Danga Interactive (http://danga.com/). Он используется такими сайтами как Slashdot и Wikipedia для снижения количества запросов к базе данных и значительно увеличивает производительность сайтов.
Memcached доступен бесплатно на http://danga.com/memcached/. Он запускается в виде сервиса и выделяет себе указанный объём оперативной памяти. Его главной особенностью является интерфейс — супер-быстрый-и-лёгкий интерфейс — используемый для добавления, получения и удаления определённых данных из кэша. Все данные хранятся только в оперативной памяти, таким образом нет излишних затрат ресурсов на работу с файловой системой или базой данных.
После установки Memcached потребуется установить библиотеку с интерфейсом для языка Python, которая не поставляется вместе с Django. Эта библиотека доступна в виде одного модуля memcache.py, который доступен по адресу http://www.tummy.com/Community/software/python-memcached/.
Для использование Memcached совместно с Django установите для параметра CACHE_BACKEND значение memcached://ip:port/, где ip — это IP адрес сервера на котором работает сервис Memcached, а port — соответственно, порт.
В данном примере Memcached запущен на локальной машине (127.0.0.1) на порту 11211:
CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
Одной из замечательных особенностей Memcached является его возможность разделять кэш между множеством серверов. Это означает, что вы можете запустить сервисы Memcached на нескольких машинах и ваше приложение будет рассматривать эту группу компьютеров как единый кэш, без необходимости копирования элементов кэша на каждый сервер. Для того, чтобы воспользоваться такими возможностями в Django, укажите все эти сервера в параметре CACHE_BACKEND, разделяя их точкой с запятой.
В данном примере кэш разделён между экземплярами Memcached, которые работают на машинах с IP адресами 172.19.26.240 и 172.19.26.242, оба на портах 11211:
CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11211/'
В следующем примере кэш распределён по экземплярам Memcached, которые работают на IP адресах 172.19.26.240 (порт 11211), 172.19.26.242 (порт 11212) и 172.19.26.244 (11213):
CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11212;172.19.26.244:11213/'
В конце следует упомянуть, что кэш работающий в оперативной памяти имеет один важный недостаток. Так как все данные кэша находятся только в оперативной памяти, данные могут быть потеряны при сбое сервера. Очевидно, что оперативная память не предназначена для постоянного хранения данных, таким образом не следует рассматривать кэш в качестве такого хранилища. Без сомнений ни один механизмов Django для кэширования информации не должен рассматриваться в качестве постоянного хранилища данных. Они предназначены только для кэширования. Мы специально упоминаем об этом, потому что все данные, хранящиеся в оперативной памяти, носят временный характер.
Для использования таблицы базы данных в виде кэша следует создать такую таблицу и указать Django, что надо использовать её для кэширования.
Сначала, создаём таблицу с помощью команды:
python manage.py createcachetable [cache_table_name]
где [cache_table_name] — имя таблицы, которая будет создана. Имя может быть любым, главное, чтобы оно соответствовало требования базы данных и не было уже занято. Эта команда создаёт одну таблицу в базе данных в соответствующем для Django формате.
После создания таблицы необходимо назначить параметру CACHE_BACKEND значение db://tablename, где tablename — имя таблицы, которую вы создали. В данном примере, имя таблицы будет my_cache_table:
CACHE_BACKEND = 'db://my_cache_table'
Система кэширование в базу данных использует ту же базу данных, которая указана в файле конфигурации. Вы не можете использовать отдельную базу данных для кэша.
Для хранения кэшированных элементов на файловой системе используйте тип file:// в параметре CACHE_BACKEND, указав каталог на файловой системе, который будет использоваться для кэша.
Например, для хранения данных кэша в каталоге
/var/tmp/django_cache
используйте это:
CACHE_BACKEND = 'file:///var/tmp/django_cache'
Следует отметить использование трёх слэшей. Первые два
относятся к file://, а третий — к пути до
каталога /var/tmp/django_cache
. Если вы
используете Windows, следует указывать букву диска после
file://, вот так:
file://c:/foo/bar.
Путь до каталога должен быть абсолютным, т.е. он должен начинаться от корня файловой системы. Наличие завершающего слэша не имеет значения.
Следует удостовериться, что каталог существует и доступен для
записи и чтения пользователю, от которого запущен веб
сервер. Продолжая предыдущий пример, если ваш сервер работает
от пользователя apache, следует проверить, что
каталог /var/tmp/django_cache
доступен
для записи и чтения этому пользователю.
Каждое значение кэша будет храниться в виде отдельного файла, содержимое которого будет представлять кэшированную информацию в сериализованном с помощью модуля pickle виде. Имя файла будет представлять собой ключ кэша в виде приемлемом для файловой системы.
Если вам требуется использовать скоростные преимущества кэширования в оперативную память, но у вас нет возможности использовать Memcached, рассмотрите использование локального кэша. Такой кэш организовывается для каждого процесса и позволяет многократное использование (thread-safe), но он не так эффективен как Memcached из-за своего простого механизма защёлок и стратегий выделения памяти.
Для использование этого типа кэширования установите для параметра CACHE_BACKEND значение locmem:///, например:
CACHE_BACKEND = 'locmem:///'
Простой, обслуживающий один процесс, кэш с расположением данных в оперативной памяти можно организовать с помощью simple:///, например:
CACHE_BACKEND = 'simple:///'
Этот кэш просто сохраняет кэшированные данные в процессе, таким образом этот тип кэша можно использовать только в процессе разработки и тестирования.
Наконец, Django поставляется с «фиктивным» кэшем, который не производит никакого кэширования.
Такой тип кэширование полезен в случае когда у вас есть работающий сайт, который мощно использует кэширование, и тестовый сайт, который вам не надо кэшировать. В этом случае установите для параметра CACHE_BACKEND значение dummy:/// в файле конфигурации тестового сайта, например:
CACHE_BACKEND = 'dummy:///'
В результате этих действие тестовый сайт не будет использовать кэширование, а основной сайт будет.
Каждый тип кэша может принимать аргументы. Они указываются в значении параметра CACHE_BACKEND. Перечислим их:
timeout: Значение по умолчанию, в секундах, для применения кэширования. Значение по умолчанию — 300 секунд (5 минут).
max_entries: Для типов кэширования: простого, локального и базы данных, этот параметр устанавливает максимальное количество элементов кэширования. При превышении этого числа из кэша удаляются самые старые значения. Значение по умолчанию — 300.
cull_frequency: Процент элементов кэша, которые удаляются при достижении максимального значения аргумента max_entries. Вычисляется так: 1/cull_frequency. Таким образом, если установить cull_frequency=2, то при заполнении кэша будет произведено удаление 50% элементов кэша.
Значение 0 для этого аргумента означает, что весь кэш должен быть очищен при заполнении кэша. Это позволяет значительно ускорить очистку кэша, ценой потери закэшированной информации. Значение по умолчанию — 3.
В данном примере, аргумент timeout имеет значение 60:
CACHE_BACKEND = "locmem:///?timeout=60"
В данном примере, аргумент timeout имеет значение 30, аргумент max_entries — 400:
CACHE_BACKEND = "locmem:///?timeout=30&max_entries=400"
Неправильные аргументы по-тихому игнорируются, как и неправильные значения поддерживаемых аргументов.
0 комментариев | Оставьте комментарий