php - MVC 的缓存层 - 模型还是 Controller ?

标签 php performance caching scalability memcached

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

在每个模型中,还是在 Controller 中?

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

想法:

方法一:

  • 没有 multiget/multi-set。如果返回大量 key ,则会造成开销。

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

方法二:

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

  • 需要更多代码

  • 更难维护

告诉我你的想法!

最佳答案

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

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

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

您是决定在初始化后不久只缓存您的数据还是缓存整个模型由您决定。

关于php - MVC 的缓存层 - 模型还是 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2915395/

相关文章:

php - 将自定义实体存储库与 FOSUserBundle 结合使用

performance - 在 Linux 上本地对 Apache 进行基准测试的好方法是什么?

python - 使用python从大文本文件中快速提取信息

ios - 如何使用解析缓存策略

php - SQL 从同一服务器上具有完全相同结构的 2 个数据库中选择

javascript - PHP 中的用户时区问题修复

php - POS 的离线数据库支持

java - 计算吞吐量

c# - OutputCache 序列化并发请求

android - 如何以编程方式计算已安装应用程序的所有缓存大小?