我对于在哪里实现缓存部分有了一些想法。你认为哪个地方最适合实施呢?
在每个模型中,或在控制器中?
// 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;
}
}
思想:
方法1:
没有多人/多人。如果返回大量密钥,将导致开销。
易于维护,所有数据库/缓存处理都在每个模型中
方法2:
更好的表现 - 使用multiset / multiget
需要更多代码
难以维持
告诉我你的想法!
答案 0 :(得分:15)
缓存应该在模型中完成。如果我不得不一般选择,我可能最终会透明地缓存模型的数据库交互,这不需要你对模型进行任何更改。其余的代码。这当然可以在模型的父类中完成。
绝对专注于缓存数据库查询结果,因为与数据库的接口是您将看到最大的开销。我认为,缓存数据库结果(或者可能是整个初始化模型)比其他任何事情更有效。
请记住,您可以在缓存之前序列化对象,因此将复杂类型(数组或对象)发送到内存缓存应该不是问题。 PHP 5提供了神奇的方法__sleep()
和__wakeup()
,用于统一和重建序列化对象。在PHP中缓存完整对象基本上是件小事。有关详细信息,请参阅http://php.net/manual/en/language.oop5.magic.php。
您是否决定在初始化后立即缓存您的数据或整个模型。
答案 1 :(得分:13)
我会将我的缓存职责牢牢地放在模型中。它不是控制器或视图的业务,其中模型正在获取数据。他们关心的是,当请求数据时,提供数据 - 这就是MVC范例应该如何工作。
将mem_cache功能抽象到父模型类中。它将减少您需要编写的代码量(代码=时间=金钱),简化对系统的修改,并消除您为每个模型生成的错误数量(参见上一个公式)。
标准化,标准化。