Как я могу спроектировать кеш-систему, используя PDO и memcached? - PullRequest
6 голосов
/ 08 апреля 2010

Я использую PDO для подключения к базе данных в системе, где я хочу реализовать memcached.

Я не знаю, какие ключи используют для кэширования результатов, потому что я не могу получить строку окончательного запроса с PDO (потому что подготовленные операторы).

Любая хорошая идея для решения этой проблемы?

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 08 апреля 2010

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

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

Обязательно прочитайте раздел «Общие подходы к проектированию» часто задаваемых вопросов по memecached. Хорошая стратегия кэширования удаляет / заменяет кэшированные данные сразу после обновления - это позволяет кэшировать данные часами / днями / неделями и одновременно никогда не предоставлять пользователям устаревшие данные.

1 голос
/ 08 апреля 2010

Вот интересный урок, он может быть полезен - http://techportal.inviqa.com/2009/02/16/getting-started-with-memcached/

Полагаю, вы можете автоматизировать процесс, реализовав такую ​​функцию:

function query($name, $sql, $params, $db, $cache) {
    $result = $this->cache->get($name);

    if (!$result) {
        $stmt = $db->prepare($sql);
        $exec = $stmt->execute($params);
        $result = $stmt->fetch(PDO::FETCH_ASSOC);

        $cache->add($name, $result);
    }

    return $result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...