2012-06-20 3 views
2

У меня есть класс базы данных, который управляет всеми моими подключениями mysql для моего приложения.Memcache - хранение результатов mysql

Мне нужно (с опозданием) реализовать Memcache по ряду причин. Я начал выяснять это, но хочу подтвердить одно.

Я надеялся внести поправки в класс со значениями по умолчанию по таймауту. Он видит, есть ли в memcache, если нет - сделайте запрос и сохраните его.

Однако похоже, что вы не можете хранить результаты mysqli (via this question). Означает ли это, что вы не можете использовать какой-либо код в приложении, который говорит $ db-> fetch_assoc() или какой-либо другой общий объект?

Если да, значит ли это, что мы говорим об изменении кода на борту? Я хочу подтвердить, прежде чем положить голову в свои руки.

+0

Ну, вы можете сохранить объект (например, 'stdClass'), содержащий ваши результаты, но вы не можете сохранить объект' mysqli_result'. Также будьте осторожны при использовании кеширования. Не переусердствуйте, иначе это сделает его бесполезным. – netcoder

ответ

6

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

Например, если у вас есть функция, как это:

function database_result($query) { 
    ... 
    $result_array = $result->fetchAll(); 
    return $result_array; 
} 

Затем вы можете добавить Memcached кэширования внутри этой функции:

function database_result($query, $expire = 60) { 
    $memcached_key = 'db:' . $query; 
    $cached = $memcached->get($memcached_key); 
    if ($memcached->getResultCode() !== Memcached::RES_NOTFOUND) { 
     return $cached; 
    } 
    ... 
    $result_array = $result->fetchAll(); 
    $memcached->set($memcached_key, $result_array, $expire); 
    return $result_array; 
} 

Если вы используете сырой PDO или MySQLi объекта везде, то у вас больше работы.

3

Вы не можете хранить все, что зависит от ресурса в memcache.

Ресурсы удаляются при завершении страницы, memcached или нет. Результат mysqli - это объект, но он зависит от ресурса, с которым вы работаете. Он предоставляет чистый метод ООП для просмотра ресурса, и этот объект, вероятно, может быть сохранен в memcache, но идентификатор ресурса будет удален при завершении страницы ...

Единственный способ хранения данных mysql (i) в memcache - чтобы закодировать его и помещать в массив, скалярные данные или данные объекта ничего не меняют и сохраняют этот массив данных, а не результат mysqli.

Удача

4

Memcache хранит строки, а не структуры. Вы должны иметь возможность сериализовать структуры как строки для их хранения и и неэтериализовать их обратно в структуры для их извлечения.

Это проще, чем кажется, поскольку PHP предоставляет набор функций для этого. См. Так: http://php.net/manual/en/function.serialize.php

Однако, как правило, когда вы выполняете кеширование результатов, вы всегда хотите выполнять столько обработок, и фильтрацию, и другие манипуляции с вашими результатами, как вы можете ПЕРЕД тем, как вы их кешируете, таким образом, когда вы извлекаете данных из кеша, вам не обязательно всегда повторять те же шаги обработки сразу после этого.

Также учтите, что MySQL уже имеет встроенный кеш запросов. Если все, что вы делаете, слепо хранит результаты запроса на основе строки запроса, то вы просто дублируете функциональность. Если вам требуется значительное повышение производительности, вам нужно «добавить значение» где-то, используя знания, которые у вас есть о приложении, для кэширования объектов приложения на более высоком уровне, чем просто результаты запросов к базе данных.

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