我正在尝试让我的缓存正常工作,这样每次我想在模型函数中缓存查询时都不需要创建一个新的memcache实例:
class contentModel {
function getData() {
$core = Connect::getInstance();
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$data = $memcache->get("query".$sql);
if($!data)
// get data
return $data;
}
}
如果在我的root index.php中,我添加:
global $memcache;
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
那么我是否可以在所有课程中调用$memcache->get($key)
而无需重新实例化?
或者我还有其他方法可以简化这个吗?
答案 0 :(得分:2)
您可以使$memcached
成为模型基类的静态成员,例如:
class Model {
protected static $memcached;
public static function setMemcached(Memcached $mc) {
self::$memcached = $mc;
}
}
class User extends Model {
public function getData() {
parent::$memcached->get("...");
}
}
// In index.php
Model::setMemcached(new Memcached("127.0.0.1:11211"));
答案 1 :(得分:0)
在数据库/数据访问库中是否可以更好地实现缓存,然后可选地针对特定查询/数据请求调用缓存?这样,用于执行缓存的实际机制对模型来说是透明的。
您只需在数据库库中维护一个可以共享的实例。检查是否使用缓存会有性能损失,但与所有模型中复杂性的增加相比,它相对便宜。
答案 2 :(得分:0)
作为一般规则,您必须认为访问缓存数据(再次)访问数据,这是您的数据访问对象(或模型,或任何您想要它们)处理的责任。
因为,如果没有,你打算做什么?提供从视图访问memcached根本没有意义,控制器?控制器应该负责管理表单信息等,但由于控制器不能访问数据库,因此不应该访问memcached。
最后,如果你在models / daos上管理你的memcached,你有一个写入/读取memcached的单点,所以你可以安全地知道缓存信息总是反映数据库信息。对于开发人员来说,它也是完全透明的(在大中型团队中特别有用)。此外,通过集中(再次,模型/ dao)访问memcached的位置,您将避免使用不同的密钥存储相同的值,因此您将节省内存并且可以缓存更多信息。