2011-05-04 67 views
1

我想在我正在使用的当前Web应用程序的模型级别使用缓存。CakePHP缓存用户特定查询数据,最佳实践

我很喜欢缓存一般的东西,像“最新消息”或其他非用户特定的事情,我正在寻找缓存查询的一些方向,依赖于用户特定的数据。

例如,用户评论的列表。查询将需要用户ID,结果将只针对该用户,那么我应该如何缓存?

更重要的是,更新注释时简单地清除整个缓存看起来效率很低,最好能得到一些关于如何清除用户特定缓存键的建议。

function getEntryByInventory($id,$company_id) { 
    $getEntryByInventory = Cache::read('Entry.getEntryByInventory.'.$id.'.'.$company_id); 
    if($getEntryByInventory !==false) { 
     return $getEntryByInventory; 
    } else {  
     $getEntryByInventory = $this->find('first' , array(
      'conditions' => array(
       'Entry.id' => $id, 
       'Inventory.company_id' => $company_id 
      ) 
     )); 
     Cache::write('Entry.getEntryByInventory.'.$id.'.'.$company_id , $getEntryByInventory); 
     return $getEntryByInventory; 
    } 
} 

// How would I clear the above cache without knowing the company id? 
function beforeSave() { 
    Cache::delete('????'); 
    return true; 
} 

我可以保存此查询在缓存中的结果,并使其具体加上$ COMPANY_ID到缓存关键,所以读取和写入高速缓存是好的。

但在这种情况下,如果我需要从缓存中删除此密钥,我需要$ company_id。

我的问题是,我正在以正确的方式进行讨论,如果没有,我可以得到一些指示!

在此先感谢。

回答

1

确保最后不是先执行缓存。一旦你的应用程序工作,你就可以开始缓存特定的元素。有些东西只是不值得高速缓存(你无法缓存所有用户的评论)。存储就在那里。在试图深入研究复杂的缓存之前,我们的工作就是消除瓶颈(大多数情况会很简单)。

0

如果您使用afterSave()功能代替beforeSave()功能,保存的数据/信息将在$this->data中可用。

public function afterSave($created, $options = array()) { 
     debug($this->data); // contains id of the modified record 
     if ($created) { 
      Cache::clear('Entry.getEntryByInventory.'.$this->data['Model']['id'].'.'.$this->data['Model']['company_id']); 
     } 
    }