Cakephp查询的缓存

时间:2015-01-08 02:32:41

标签: php mysql cakephp cakephp-2.5

我想为cakephp 2.5.3实现一个与find查询相关的缓存功能,但是我希望在与表相关的所有事件(update,delete,...)上使缓存无效。 我将其编码为AppModel.php,您能告诉我您对代码逻辑和效率有何看法? 感谢。

public function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
    $keyName = sha1(serialize(func_get_args()));
    if (Cache::read($this->table . '_' . $keyName, '5m') !== false) {
        $this->log('read cache ' . $this->table . '_' . $keyName);

        return Cache::read($this->table . '_' . $keyName, '5m');
    } else {

        $data = parent::find($conditions, $fields, $order, $recursive);
        Cache::write($this->table . '_' . $keyName, $data, '5m');
        $this->addToCacheList($keyName);
        $this->log('add ' . $this->table . '_' . $keyName);

        return $data;
    }
}

public function afterSave($created, $options = array()) {

    $this->flushCacheList();

    parent::afterSave($created, $options);
}

public function afterDelete() {

    $this->flushCacheList();

    parent::afterDelete();
}

public function addToCacheList($keyName) {
    if (Cache::read($this->table, '5m') !== false) {
        $values = Cache::read($this->table, '5m');
        $values[] = $keyName;
    } else {
        $values = array($keyName);
    }

    Cache::write($this->table, $values, '5m');
}

public function flushCacheList() {
    if (Cache::read($this->table, '5m')) {
        $values = Cache::read($this->table, '5m');
        foreach($values AS $value) {
            Cache::delete($this->table . '_' . $value, '5m');
            $this->log('flush ' . $this->table . '_' . $value);
        }
        Cache::delete($this->table, '5m');
    }
}

1 个答案:

答案 0 :(得分:0)

CakePHP已经a built in query cache

  

您如何看待代码逻辑和效率?

我不确定,但我认为你经常刷新缓存以提高效率。

不要考虑性能基准它。唯一可靠的方法是基准。

但我会说cache the results of queries instead.