Уровень кэша для MVC - модель или контроллер?
У меня возникают некоторые мысли о том, где реализовать часть кэширования. Где, пожалуй, самое подходящее место для его реализации?
Внутри каждой модели или в контроллере?
Подход 1 (psuedo-code):
// 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;
}
}
Подход 2:
// 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:
Расскажите, что вы думаете!
Ответы
Ответ 1
Кэширование должно выполняться в модели. Если бы мне пришлось выбирать вообще, я бы, вероятно, в конечном итоге обеспечил прозрачное кэширование взаимодействия базы данных модели, что не потребовало бы внесения каких-либо изменений в остальной части вашего кода. Это, конечно, будет сделано в родительском классе ваших моделей.
Определенно сосредоточиться на кешировании результатов запроса к базе данных, так как взаимодействие с вашей базой данных - это то, где вы увидите самые накладные расходы. Я бы сказал, что было бы более эффективно кэшировать результаты вашей базы данных (или, может быть, всю вашу инициализированную модель) больше всего на свете.
Помните, что вы можете сериализовать объекты перед кешированием, поэтому отправка сложных типов (массивов или объектов) в memcache не должна быть проблемой. PHP 5 предоставляет магические методы __sleep()
и __wakeup()
для целей серализации и восстановления ваших сериализованных объектов. Кэширование полных объектов в PHP - это, в основном, кусок пирога. Подробнее см. http://php.net/manual/en/language.oop5.magic.php.
Независимо от того, решаете ли вы кешировать только свои данные или всю вашу модель вскоре после того, как инициализация зависит от вас.
Ответ 2
Я бы сохранил свои обязанности кэширования в рамках модели. Это не бизнес-контроллер или вид, где модель получает данные. Все, о чем они заботятся, это то, что при запросе данных предоставляются данные - так предполагается, что парадигма MVC должна работать.
Обобщите функциональность mem_cache в родительском классе модели. Он сократит объем кода, который вам нужно записать (code = time = money), упростит изменения в системе и устранит количество ошибок, которые вы производите для каждой модели, которую вы создаете (см. Предыдущую формулу).
Стандартизировать, стандартизировать.