2012-04-13 3 views
17

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

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

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

Как работает весь этот файл memcache (или, в любом случае, любой кеширующий материал)?

ответ

22

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

В отношении 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 для получения дополнительной информации, есть некоторые хорошие примеры и комментарии.

+0

Можем ли мы хранить регулярные переменные для memcached? Это на практике? –

+0

Чтобы быть более конкретным, у меня есть много постоянных переменных, которые используются во всем приложении. Могу ли я хранить их в кеше? –

+1

Можете ли вы привести пример «постоянной» переменной? По определению константы не являются динамическими. –

1

Существует несколько примеров того, как работает memcache. Here является одной из ссылок.

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

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

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

+0

спасибо !. но я думаю, мой вопрос не ясен.Допустим, это вопрос: ' ** ВЫБРАТЬ имя, возраст от лица ** ' code' и это результат: 'code' Криш, 45 Джош, 25 Kevin, 60 ' код ' в следующий раз, когда я называю тот же запрос, он может вернуться: ' code' Джо, 45 Jay, 25 Крис, 60 'code' –

+0

Извините за REPOST: спасибо !. но я думаю, мой вопрос не ясен. Допустим, это вопрос: ' ** ВЫБРАТЬ имя, возраст от Person ** ' и это результат: ' Криш, 45 Джош, 25 Kevin, 60 ' В следующий раз, когда я называю тот же запрос, он может вернуться: ' Джо, 45 Jay, 25 Криса, 60 ' Как кеширования работы здесь? Как запрос кэшируется? –

+2

Этот запрос не может быть получен из вашего кеша. Кэширование предполагает, что данные не изменились со времени предыдущего запроса. На самом деле все это временно хранит некоторые данные в памяти для быстрого доступа. Посмотрите на это так: если вы только что подали запрос на просмотр всех лиц в вашей базе данных, чье имя начинается с «Kev» и старше 25 лет. В первый раз, когда ваше приложение получило этот запрос, ему пришлось спросить MySQL получить результаты. Если вы затем скажете своему приложению кэшировать эти результаты, в следующий раз, когда кто-нибудь запустит этот * точный * тот же запрос, он может просто ответить из кеша. Это не работает, если данные разные. – Daan

1

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

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

+0

Спасибо большое!Это видео полезно! –

Смежные вопросы