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