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