У меня есть некоторые долгие размышления о том, где реализовать кэширующуюся часть. Где самое соответствующее место состоит в том, чтобы реализовать его, Вы думаете?
В каждой модели, или в контроллере?
// mycontroller.php
MyController extends Controller_class {
function index () {
$data = $this->model->getData();
echo $data;
}
}
// myModel.php
MyModel extends Model_Class{
function getData() {
$data = memcached->get('data');
if (!$data) {
$query->SQL_QUERY("Do query!");
}
return $data;
}
}
// mycontroller.php
MyController extends Controller_class {
function index () {
$dataArray = $this->memcached->getMulti('data','data2');
foreach ($dataArray as $key) {
if (!$key) {
$data = $this->model->getData();
$this->memcached->set($key, $data);
}
}
echo $data;
}
}
// myModel.php
MyModel extends Model_Class{
function getData() {
$query->SQL_QUERY("Do query!");
return $data;
}
}
Мысли:
Подход 1:
Нет мультиполучите/мультиустановите. Если бы высокое количество ключей было бы возвращено, наверху был бы вызван.
Легче поддержать, вся обработка базы данных/кэша находится в каждой модели
Подход 2:
Лучше performancewise - мультимножество/мультиполучать используется
Больше кода требуется
Тяжелее поддержать
Скажите мне, что Вы думаете!
Кэширование должно выполняться в модели. Если бы мне пришлось выбирать в целом, я бы, вероятно, в конечном итоге прозрачно кэшировал взаимодействие модели с базой данных, что не потребовало бы от вас каких-либо изменений в остальной части вашего кода. Конечно, это будет сделано в родительском классе ваших моделей.
Определенно сосредоточьтесь на кэшировании результатов запросов к базе данных, поскольку взаимодействие с базой данных - это то место, где вы столкнетесь с наибольшими накладными расходами. Я бы сказал, что было бы более эффективно кэшировать результаты вашей базы данных (или, возможно, всю вашу инициализированную модель) больше, чем что-либо еще.
Помните, что вы можете сериализовать свои объекты перед кэшированием, поэтому отправка сложных типов (массивов или объектов) в memcache не должна быть проблемой. PHP 5 предоставляет волшебные методы __ sleep ()
и __ wakeup ()
именно для целей разделения и реконструкции ваших сериализованных объектов. Кэширование полных объектов в PHP - это, по сути, кусок пирога. См. http://php.net/manual/en/language.oop5.magic.php для получения дополнительной информации.
Решаете ли вы кэшировать только свои данные или всю модель сразу после инициализации, решать вам.
Я бы строго сохранил свои обязанности по кэшированию в рамках модели. Это не является делом контроллера или представления , где модель получает данные. Все, что их волнует, это то, что при запросе данных данные предоставляются - именно так должна работать парадигма MVC.
Абстрагируйте вашу функциональность mem_cache в родительский класс модели. Это сократит объем кода, который вам нужно написать (код = время = деньги), упростит модификации системы и устранит количество ошибок, которые вы создаете для каждой модели, которую вы создаете (см. Предыдущую формулу).
Стандартизируйте, стандартизируйте.