MVC 的缓存层 - 模型还是控制器?

我正在对在何处实现缓存部分进行一些思考。您认为哪里最适合实施它?

在每个模型内部,还是在控制器中?

方法 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:

  • 没有多get/多集。如果返回大量密钥,则会导致开销。

  • 更易于维护,所有数据库/缓存处理都在每个模型中

方法 2:

  • 性能更佳 - 使用多集/多get

  • 需要更多代码

  • 更难维护

告诉我你的想法!


答案 1

缓存应在模型中完成。如果我必须在一般情况下进行选择,我最终可能会透明地缓存模型的数据库交互,这不需要您对代码的其余部分进行任何更改。这当然可以在模型的父类中完成。

一定要专注于缓存数据库查询结果,因为与数据库的接口是您看到开销最大的地方。我认为,缓存数据库结果(或者可能是整个初始化的模型)比其他任何事情都更有效。

请记住,您可以在缓存之前序列化对象,因此将复杂类型(数组或对象)发送到 memcache 应该不是问题。PHP 5 提供了神奇的方法,用于序列化和重建序列化对象。在PHP中缓存完整的对象基本上是小菜一碟。有关详细信息,请参阅 http://php.net/manual/en/language.oop5.magic.php__sleep()__wakeup()

您决定在初始化后不久仅缓存数据还是整个模型取决于您。


答案 2

我会将缓存职责牢牢地保留在模型中。模型获取数据不是控制器或视图的业务。他们所关心的只是,当请求数据时,就会提供数据 - 这就是MVC范式应该如何工作。

将mem_cache功能抽象到父模型类中。它将减少您需要编写的代码量(代码=时间=金钱),简化对系统的修改,并消除您构建的每个模型产生的错误数量(请参阅前面的公式)。

标准化,标准化。


推荐