我正在考虑在何处实现缓存部分。您认为在哪里实现最合适?
在每个模型中,还是在 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/