【问题标题】:Cache layer for MVC - Model or controller?MVC 的缓存层 - 模型还是控制器?
【发布时间】:2011-02-24 07:35:22
【问题描述】:

我正在考虑在哪里实现缓存部分。您认为在哪里实施它最合适?

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

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

方法二:

// 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;
    }  
}

想法:

方法一:

  • 没有多重获取/多重设置。如果会返回大量的键,则会产生开销。

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

方法二:

  • 更好的性能 - 使用 multiset/multiget

  • 需要更多代码

  • 更难维护

告诉我你的想法!

【问题讨论】:

    标签: php performance caching scalability memcached


    【解决方案1】:

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

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

    标准化,标准化。

    【讨论】:

    • 感谢您的好回答。我只是想知道,如何在模型中实际实现缓存?您是否使用 SQL 查询本身作为键来保存数据?如果您使用准备好的语句怎么办?不同的参数会有一个关键冲突。如果您不使用查询本身,您如何唯一标识结果集?如果答案太复杂,我会为此提出一个单独的问题。
    • 我建议将查询的 md5 哈希与输入参数的序列化版本结合使用。
    • 这绝对看起来效率不高。如果程序员不能直接选择什么时候缓存什么时候不缓存,那么 Model 本身如何区分搜索和常规 SELECT 查询以进行简单显示呢?这本身看起来几乎就像是在控制器中缓存的参数,因为缓存的主要规则之一是除非必要,否则不应缓存,并且在大多数情况下,除非您是 Google,否则不应缓存搜索结果。为什么不直接告诉它何时缓存在我的控制器中,我可以完全控制它?
    • 这个讨论值得自己提出问题——原来的问题是关于MVC实现的。这是一个更具体到结果缓存的问题。
    • 好的。在这里开始了一个新问题:stackoverflow.com/questions/2916645/…
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这是一个非常有趣的想法,在模型的父级中这样做似乎是一个非常好的想法!一定会开箱即用!
    • 我现在只是因为某种原因才开始使用缓存,当真正需要时。但是很棒的答案,让我更感兴趣:)
    猜你喜欢
    • 2012-06-02
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多