Уровень кэша для MVC - модель или контроллер? - PullRequest
15 голосов
/ 26 мая 2010

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

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

Подход 1 (псевдо-код):

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

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

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

  • Труднее поддерживать

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

Ответы [ 2 ]

15 голосов
/ 26 мая 2010

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

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

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

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

13 голосов
/ 26 мая 2010

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

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

Стандартизировать, стандартизировать.

...