我想为 cakephp 2.5.3 实现与查找查询相关的缓存功能,但我想使与表相关的所有事件的缓存无效(更新、删除......我将其编码到 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');
}
}
CakePHP 已经有一个内置的查询缓存。
您如何看待代码逻辑和效率?
我不确定,但我认为您过于频繁地刷新缓存以提高效率。
不要考虑性能基准。唯一可靠的方法是基准测试。
但我会说缓存查询结果。