Уровень Cache для MVC - Модель или контроллер?

У меня есть некоторые долгие размышления о том, где реализовать кэширующуюся часть. Где самое соответствующее место состоит в том, чтобы реализовать его, Вы думаете?

В каждой модели, или в контроллере?

Подход 1 (psuedo-код):

// 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:

  • Лучше performancewise - мультимножество/мультиполучать используется

  • Больше кода требуется

  • Тяжелее поддержать

Скажите мне, что Вы думаете!

15
задан Industrial 26 May 2010 в 17:41
поделиться

2 ответа

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

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

Помните, что вы можете сериализовать свои объекты перед кэшированием, поэтому отправка сложных типов (массивов или объектов) в memcache не должна быть проблемой. PHP 5 предоставляет волшебные методы __ sleep () и __ wakeup () именно для целей разделения и реконструкции ваших сериализованных объектов. Кэширование полных объектов в PHP - это, по сути, кусок пирога. См. http://php.net/manual/en/language.oop5.magic.php для получения дополнительной информации.

Решаете ли вы кэшировать только свои данные или всю модель сразу после инициализации, решать вам.

15
ответ дан 1 December 2019 в 02:28
поделиться

Я бы строго сохранил свои обязанности по кэшированию в рамках модели. Это не является делом контроллера или представления , где модель получает данные. Все, что их волнует, это то, что при запросе данных данные предоставляются - именно так должна работать парадигма MVC.

Абстрагируйте вашу функциональность mem_cache в родительский класс модели. Это сократит объем кода, который вам нужно написать (код = время = деньги), упростит модификации системы и устранит количество ошибок, которые вы создаете для каждой модели, которую вы создаете (см. Предыдущую формулу).

Стандартизируйте, стандартизируйте.

13
ответ дан 1 December 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: