Хобрук: Ваш путь к мастерству в программировании

Как работает memcache с MySQL?

Я пытаюсь понять (и, возможно, развернуть) memcached в нашем env.

У нас есть 4 веб-сервера на балансировщике нагрузки, на которых запущено большое веб-приложение, разработанное на PHP. Мы уже используем APC. Я хочу посмотреть, как работает memcached? По крайней мере, может быть, я не понимаю, как работает кеширование.

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

Как работает весь этот кэш памяти (или, если на то пошло, все кеширование)?

13.04.2012

Ответы:


1

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

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

Пример (только демонстрационный):

$cache = new Memcached();

$cache->addServer('servername', 11211);

$myCacheKey = 'my_cache_key';

$row = $cache->get($myCacheKey);

if (!$row) {

    // Issue painful query to mysql
    $sql = "SELECT * FROM table WHERE id = :id";

    $dbo->prepare($sql);
    $stmt->bindValue(':id', $someId, PDO::PARAM_INT);

    $row = $stmt->fetch(PDO::FETCH_OBJ);

    $cache->set($myCacheKey, serialize($row));
}

// Now I have access to $row, where I can do what I need to
// And for subsequent calls, the data will be pulled from cache and skip
// the query altogether
var_dump(unserialize($row));

Ознакомьтесь с документацией PHP на memcached для получения дополнительной информации, есть несколько хороших примеров и комментариев.

13.04.2012
  • Можем ли мы хранить обычные переменные в memcached? Это на практике? 13.04.2012
  • Чтобы быть более конкретным, у меня есть много постоянных переменных, которые используются во всем приложении. Могу ли я хранить их в кеше? 13.04.2012
  • Вы можете привести мне пример «постоянной» переменной? По определению, константы не являются динамическими. 13.04.2012
  • определить ('ПЕРЕМЕННАЯ') = 'xyz'; $ another_var = 'abc' $ stillanothervar = массив (x, y, z); и т.д 14.04.2012
  • Вы можете кэшировать содержимое $another_var и $yetanothervar, как показано во фрагменте, но я бы не рекомендовал кешировать определение. 14.04.2012
  • Спасибо! Каковы лучшие кандидаты для кэширования памяти из базы данных? Когда данные являются динамическими, не уверен, что кэшировать и как этим воспользоваться. 16.04.2012
  • Всегда начинайте с самых медленных запросов, которые вы выполняете. Кэшируя результаты медленных запросов, вы получаете максимальную отдачу от вложенных средств. Загвоздка в том, что вам нужно написать механизм для добавления в кеш, удаления из кеша (не обязательно, но хорошая практика) и обновления кеша, которые отражают ваш самый последний набор данных. Фактически вы можете сохранить два разных значения для одного и того же ключа, но memached вернет только самое последнее. Таким образом, вы можете складывать ключи, но я всегда стараюсь их удалить, когда могу, чтобы освободить память. 16.04.2012
  • Спасибо! Но остался один вопрос. Когда данные являются динамическими, не уверен, что кэшировать и как этим воспользоваться. Очевидно, что данные не будут одинаковыми для каждого набора результатов даже из одной и той же таблицы. 16.04.2012
  • Динамические данные не проблема, вы можете сериализовать результаты и сохранить в кэше памяти, единственная уловка - вам нужно сгенерировать ключ, который вы можете связать с данными, чтобы вы могли получить его позже. 17.04.2012
  • Как мне узнать, какой КЛЮЧ использовать? Нужна ли мне база данных для хранения списка ключей? Что относится к ХХ запросу? 18.02.2014
  • Нет, ключи создаются на основе определенного соглашения об именах. Например, если вы храните данные пользователя, вы должны использовать такой ключ, как: user_data_X (где X - номер идентификатора пользователя). Вы также можете хэшировать некоторые атрибуты, которые могут храниться в кеше для упрощения генерации ключей кеша. $cacheKey = md5(sprintf('%s_%s', $user->getEmailAddress(), $user->getId()) 18.02.2014

  • 2

    Есть несколько примеров того, как работает memcache. Вот одна из ссылок .

    Во-вторых, Memcache может работать как с MySQL, так и без него.

    Он кэширует ваши объекты, которые находятся в PHP, теперь независимо от того, идет ли он из MySQL или где-то еще, если это объект PHP, он может храниться в MemCache.

    APC дает вам больше возможностей, чем Memcache. Помимо хранения / кеширования объектов PHP, он также кэширует PHP-исполняемые-машиночитаемые-коды операций, чтобы ваши файлы PHP не проходили процессы загрузки в память-> Comiled, скорее, он напрямую запускает уже скомпилированный код операции из памяти.

    13.04.2012
  • Благодарность!. но я думаю, мой вопрос непонятен. Допустим, это запрос: `** SELECT Name, age from Person ** code и это результат: code Krish, 45 Josh, 25 Kevin, 60 code В следующий раз, когда я вызову тот же запрос, он может вернуть: code Джо, 45 Джей, 25 Крис, 60 code 13.04.2012
  • Извините за репост: спасибо !. но я думаю, мой вопрос непонятен. Допустим, это запрос: `SELECT Name, age from Person` и результат: `Krish, 45 Josh, 25 Kevin, 60` В следующий раз, когда я вызываю тот же запрос, он может вернуться: `Joe, 45 Jay, 25 Chris, 60` Как здесь работает кеширование? Как кешируется запрос? 13.04.2012
  • На этот запрос нельзя ответить из вашего кеша. Кэширование предполагает, что данные не изменились с момента предыдущего запроса. На самом деле все, что он делает, это временно сохраняет некоторые данные в памяти для быстрого доступа. Посмотрите на это так: если вы только что подали запрос на просмотр всех лиц в своей базе данных, чьи имена начинаются с Kev и которые старше 25. Когда ваше приложение впервые получило этот запрос, оно должно было попросить MySQL получить Результаты. Если вы затем укажете своему приложению кэшировать эти результаты, в следующий раз, когда кто-то выполнит этот точный запрос, оно сможет просто ответить из кеша. Это не работает, если данные другие. 13.04.2012
  • Хорошо, я понимаю. Но если результирующий набор меняется каждый раз, я не думаю, что от кеша можно применить какой-либо смысл. 13.04.2012

  • 3

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

    PS: Я быстро поискал в Google и нашел это видео о memcached, которое имеет довольно хорошее качество => http://www.bestechvideos.com/2009/03/21/railslab-scaling-rails-episode-8-memcached. Единственная проблема может заключаться в том, что в нем говорится о Ruby On Rails (который я тоже не так часто использую, но его очень легко понять). Надеюсь, это поможет вам лучше понять концепцию.

    13.04.2012
  • Большое спасибо! Это видео полезно! 13.04.2012
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..