CakePHP кэширование пользовательских данных запроса, лучшие практики - PullRequest
1 голос
/ 04 мая 2011

Я хотел бы использовать кеширование на уровне модели в текущем веб-приложении, над которым я работаю.

Мне удобно кэшировать общие вещи, такие как "последние новости" или другие не связанные с пользователем вещи, подобные этому, Я ищу какое-то руководство по кешированию запросов, которые основаны на пользовательских данных.

Например, список комментариев пользователя.Для запроса потребуется идентификатор пользователя, а результат будет относиться только к этому пользователю, поэтому как мне его кэшировать?

Что еще более важно, простая очистка всего кэша при обновлении комментария кажется очень неэффективной, этобыло бы неплохо получить несколько советов о том, как очистить специфичные для пользователя ключи кэша.

Пример

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.

Мой вопрос в том, правильно ли я поступлю, и если нет, то я могу получить несколько указателей, пожалуйста!

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Убедитесь, что вы используете кэширование последним, а не первым.Как только ваше приложение заработает, вы можете начать работу над кэшированием определенных элементов.Некоторые вещи просто не стоит кэшировать (вы не можете кэшировать комментарии всех пользователей везде).Для этого есть хранилище.Лучше поработайте над устранением узких мест (большинство из которых будут простыми), прежде чем пытаться углубиться в сложное кэширование.

0 голосов
/ 05 июня 2014

Если вы используете функцию 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']);
        }
    }
...