Использование memcached для ускорения работы высоконагруженных проектов

Memcached (читается мемкЭшид) — это система кэширования различных объектов в оперативной памяти. Позволят значительно снизить нагрузку на базу или файловую систему и ускорить работу сайта, за счет того, что работа с памятью быстрее чем с базой или файлами. Насколько я помню была разработана для LJ, а сейчас применяется практически на всех проектах с большим количеством пользователей. Запускается отдельным сервером. Если вы собираетесь делать свой стартап, то советую обратить на эту технологию пристальное внимание.

Для PHP есть специальный PECL-модуль (то есть он не поставляется вместе с PHP, надо отдельно скачивать и компилировать). Думаю также есть готовые модули для Perl, Python (Django), Ruby(RoR) и других языков .

В API самого мемкеша есть только базовые функции: выбор сервера, коннект и дисконект, добавление, удаление, обновление и получение объекта, инкримент и дикримент. Для каждого объекта устанвливается время жизни, от 1 секунды до бесконечности. При переполнение памяти более старые объекты автоматически удаляются. Для PHP также есть уже готовые библиотеки для работы с мемкешем, которые дают дополнительную функциональность.

Базовый алгоритм работы с мемкешем следующий — обращается к мемкеш-серверу за объектом, если он есть то берем его. Если нет, то обращаемся к базе данных (или где там еще у вас могут хранится данные), формируем объект, выдаем его пользователю и добавляем в мемкеш, чтобы мы могли прочитать его при следующем обращение.

В мемкеше имеет смысл хранить только часто запрашиваемые данные. Если какой то объект запрашивается у вас раз в неделю, то скорее всего лучший использовать файловый кеш. Хотя это также зависит и от архитектуры проекта.

Пример использования мемкеша есть в одной из моих предыдущих заметок.

P.S. Пару ссылок на разные интересные посты.
Михаил Туренко нашел способ проверять свободен домен или нет через sms.

Ильшат Саетов расказыват о своем опыте общения с сотрудниками и роботами хостинг-провайдера Arbatek. Смех и слезы. Но быть их клиентами я после такого не захочу.

Сергей Кадаков дает пару советов начинающим стартапщикам.

Теги: , ,

Еще по теме

Posted on октября 10, 2007 
Filed Under Проектирование и разработка сайтов

Комментарии

Всего комментариев: 25

  1. Alexander - октября 10, 2007 15:44

    Вот! Об этом можно и подробнее. Очень интересно было бы почитать о том, как вы ускоряете НГС. Как-то у меня очень интересовались этими способами ;)

  2. Денис Болтиков - октября 10, 2007 15:51

    Задавай вопросы. На мелкие отвечу тут, на более объемные отдельными постами.

    Если кратко, то

    а) оптимизация php-кода

    б) оптимизация sql-запросов

    в) оптимизация структуры баз данных

    г) кеширование данных в memcached

    д) кеширование sql запросов

    е) вынос статики (картинки, css) на отдельный легкий сервер (без php и прочих модулей)

    ж) использование кластеров веб-серверов, баз данных

    з) использование nginx вместо апача

  3. Майк - октября 10, 2007 20:22

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

  4. Денис Болтиков - октября 10, 2007 20:28

    2Майк

    со временем будет :) про мемкеш достаточно развернуто? или может чего не хватает?

  5. Денис Болтиков - октября 10, 2007 20:29

    Или лучше разбирать на живых примерах?

  6. Майк - октября 10, 2007 20:42

    По-моему, про мемкэш говорить особо нечего. А вот про оптимизацию структуры баз данных можно много чего написать.

  7. Денис Радченко - октября 10, 2007 20:50

    Денис Болтиков, был бы раз, если бы вы привели маленький пример. Как вы думаете, доработать форум, чтобы он использовал memcached + mysql ?

  8. Денис Болтиков - октября 10, 2007 22:02

    2Денис Радченко

    Завтра посмотрю, что мы у себя у себя делали, еще дополнительно подумаю и напишу.

  9. Anton - октября 11, 2007 02:39

    Не хватает пары конкретных примеров, что в этот memcached можно пихать. Честно говоря, не представляю, где он может пригодится. Приведенный пример не нравится: для такой примитивной задачи такая сложная система используется.

  10. Денис Болтиков - октября 11, 2007 08:54

    2Anton

    В мемкеш помещаются динамически генерируемые, но при это постоянные на какой-то срок, данные для одного пользователя или группы.

    Например в этом блоге это может быть блогролл, блок последние посты, последние комментарии, рубрики, массив комментариев для каждого поста, сами посты. В итоге мы избавляемся практически от всех запросов к базе данных, что значительно увеличит возможную нагрузку на сайт (кол-во одновременных запросов). В данный момент это не актульно, так как тут бывает всего по 100 человек в день, но есть проекты для которых это важно. Там сидит по 2000—3000 человек онлайн и каждый запрос к базе очень-очень важен. По собственному опыту скажу, при неправельнной работе с базой и не использовании мемкеша проблема могут начаться уже при полторы сотне пользователей онлайн.

    Про проверку онлайн. Я бы не сказал что это простая задача. Она дается значительную нагрузку на базу при большом кол-ве пользователей онлайн, так как проверка и обновление данных происходит при каждом хите. И моя идея, которую я сейчас реализую на своей работе, была высоко оценена, так как несколько десятков тысяч тысяч запросов к базе можно будет сделать кешируемыми + часть данных за кешировать + улучшить функционал некоторых разделов.

  11. Anton - октября 11, 2007 11:51

    Про примеры насчет блога понял, спасибо. Но я не настолько увлекаюсь динамикой, предпочитаю генерацию статики. ;)

    Про проверку онлайн. Я бы не сказал что это простая задача.

    Это ОЧЕНЬ простая и примитивная задача. И решается совсем другим способом. Знакомы с FastCGI?!

  12. Денис Болтиков - октября 11, 2007 13:20

    динамикой, предпочитаю генерацию статики

    В веб-сервисах, где выводится персонализированая информация сильно статику не погенерируешь. Страницу все равно надо собирать из кусочков.

    Это очень простая? Расскажи каким образом ее можно решить :)

    С FastCGI знаком. Это интерфейс для передачи запросов от веб-сервера к внешним программам. Особенность его в том, что fastcgi-программа не перезапускается каждый раз, а ее процесс сохраняется и ему передаются запросы от веб-сервера. Плюс fastcgi-gпрораммы могут быть запущены не только на том сервере, где расположен веб-сервер, но и на другом.

  13. Денис Болтиков - октября 11, 2007 13:36

    2Anton

    Почитал твой server-tuning.info/ru/

    Полезная информация для новичков, жаль что мало. Продолжение будет?

  14. Как сделать сайт, который не упадет, или техническая сторона стартапа : Денис Болтиков - октября 11, 2007 18:12

    [...] пост: Использование memcached. Там уже развернулась интересная [...]

  15. Anton - октября 11, 2007 19:27

    fastcgi-программа не перезапускается каждый раз, а ее процесс сохраняется

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

    Насчет server-tuning.info — продолжение обязательно будет, но как скоро, увы, не знаю.

  16. Vyazovoi - октября 12, 2007 01:01

    такой вопрос.

    имеем низкопроизводительный сервер (и памяти мало и проц слабый), на нем апач2 + myqsl.

    Сабж мне непоможет, переписывать приложение по другую БД нет времени и желания, но может есть чтото вместо апач2? Подумываю потестить на первом апаче. Конкретно тотже lighthttpd как поддерживает php? Есть ли проблемы совместимости с скрипатми написанными для связки apache+php5?

  17. Пост на конкурс “Раскрути свой блог” : Денис Болтиков - октября 13, 2007 14:21

    [...] стартапов и первый обзорный пост на эту тему про memcached увеличило кол-во подписчиков процентов на [...]

  18. Блог юного спортсмена - разработчика » Архив блога » memcached - октября 14, 2007 14:01

    [...] Оригинал Оставить комментарий RSS Комментариев Назад: Одноклассники.ru [...]

  19. Зубрик - октября 24, 2007 02:31

    А если ситуация что есть NFS сервер к которому прикручено 20 клиентов, которые работают с файлами оттуда (без базы данных) постоянно, и пишут в одни и те же файлы постоянно, при этом фронт-енд работает либо на nginx либо на подобном — memcached может быть полезен хоть каким-то боком?

    Зубрик.

  20. Денис Болтиков - октября 24, 2007 14:19

    На первый взгляд никак. Более подробно модем по электропочте пообщаться.

  21. alfa - октября 27, 2007 22:50

    memcached штука отличная, мы используем переписаный PEAR DB, который позволяет не задумываться над написанием конструкций memcached запросов, просто делая обычный SELECT и передавая параметр кэшировать или нет

  22. Денис Болтиков - октября 27, 2007 22:53

    Я хочу поискать библиотеку, которая позволяет сохранять как в файлы, так и в мемкеш, в зависимости от настроек.

  23. alfa - октября 28, 2007 01:39

    Имхо быстрее сделать свою, когда занялись вопросом быстроты pear db, то выкидывание из него всего лишнего, оставление функций getOne, getRow, getAll и поддержка DB_FETCHMODE_ASSOC дало ускорение работы с мускулом на этапе коннекта и работы более чем в 10 раз. Собственно сам класс стал весить 4020 байт :) это с комментариями, функциями работы с мемкешем и т.п., думаю если померить обычные DB.php и PEAR.php, можно призадуматься.

  24. TYUS - июля 17, 2008 13:16

    Денис, куда же вы пропали, постоянно читал ваш блог, надеялся еще увидеть инфу о мемкеше

  25. Max - июля 31, 2008 02:03

    PEAR DB действительно тяжеловат. Я как альтернативу ему начал использовать DbSimple. У него уже кстати есть функция полезная.

    $DB = DbSimple_Generic::connect($dsn);

    // Set caching function

    $DB->setCacher('myCacher');

    // Define caching function.

    function myCacher($key, $value) {

    // Если $value !== null, то следует записать его в кэш с ключом $key.

    // Если $value === null, то следует вернуть значение кэша с ключом $key.

    }

    Дописать функцию для работы с memcache`м или файлами думаю не сложно будет.

    Библиотеку можно найти тут: dklab.ru/lib/DbSimple/manual.html#cont35

Комментарии закрыты.

Тема Vertigo Blue Theme от Brian Gardner.
Движок WordPress.

Рейтинг блогов