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

时间:2010-05-26 17:41:46

标签: php performance caching scalability memcached

我对于在哪里实现缓存部分有了一些想法。你认为哪个地方最适合实施呢?

在每个模型中,或在控制器中?

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

  • 更好的表现 - 使用multiset / multiget

  • 需要更多代码

  • 难以维持

告诉我你的想法!

2 个答案:

答案 0 :(得分:15)

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

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

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

您是否决定在初始化后立即缓存您的数据或整个模型。

答案 1 :(得分:13)

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

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

标准化,标准化。