当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《MVC的缓存层-模型还是控制器?》经验,为你挑选了2个好方法。

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

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

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

需要更多代码

更难维护

告诉我你的想法!



1> Kenaniah..:

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

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

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

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



2> Jarrod Nettl..:

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

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

标准化,标准化.

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有