Почему перед написанием кеша
вам стоит поговорить с психологом?

Дмитрий Рычков
Общий подход

     Class/Widget
                        Class/Widget


                        Class/Widget
Class/Widget

                        Class/Widget


                        Class/Widget


Class/Widget
Компоненты фреймворков



3.Любое хранилище (диск, мемкеш, NoSQL…)
4.Любой тип данных
5.Инвалидация по времени или даже внешним параметрам
Компоненты фреймворков

class DemoView extends View {

    public function data($userId, $itemId) {
     //check cache
     if (!$result = Cache::get(‘demo_’ . $userId . ‘_’ . $itemId)) {

            //retrieve heavy data
            $data = Model::getHeavyData($userId, $itemId);
            $result = $this->render($data);

            //save cache
            Cache::set(‘demo_’ . $userId . ‘_’ . $itemId, $result);
        }
    }
}
Компоненты фреймворков

class DemoView extends View {

    public function data($userId, $itemId) {
     //check cache
     if (!$result = Cache::get(‘demo_’ . $userId . ‘_’ . $itemId)) {

            //retrieve heavy data
            $data = Model::getHeavyData($userId, $itemId);
            $result = $this->render($data);

            //save cache
            Cache::set(‘demo_’ . $userId . ‘_’ . $itemId, $result);
        }
    }
}
Компоненты фреймворков

class DemoView extends View {                                Основная логика под “if”

    public function data($userId, $itemId) {
     //check cache
     if (!$result = Cache::get(‘demo_’ . $userId . ‘_’ . $itemId)) {

            //retrieve heavy data
            $data = Model::getHeavyData($userId, $itemId);
            $result = $this->render($data);

            //save cache
            Cache::set(‘demo_’ . $userId . ‘_’ . $itemId, $result);
        }
    }
}
Компоненты фреймворков




               keys


Application           Cache component
Интеграция кеширования
class DemoView extends View {

    protected function data($userId, $itemId) {




        $this->data->userId = $userId;
        $this->data->itemId = $itemId;
        $this->data->heavy = Model::getHeavyData($userId, $itemId);




    }
}
Интеграция кеширования
class DemoView extends View {

    protected function data($userId, $itemId) {
      $this->data->userId = $userId;
      $this->data->itemId = $itemId;




        $this->data->heavy = Model::getHeavyData($userId, $itemId);
    }
}
Интеграция кеширования
class DemoView extends View {
  //set light view data
  protected function dynamic($userId, $itemId) {
    $this->data->userId = $userId;
    $this->data->itemId = $itemId;
  }
  //define which light data to use for key
  public function getKey() {
    return array($this->data->userId, $this->data->itemId);
  }

    // if cache did not work set heavy data
    protected function cached () {
      $this->data->heavy = Model::getHeavyData($userId, $itemId);
    }
}
Интеграция кеширования


                      т разработчика теперь требуется только
  Application         разделить данные на формирующие
                      ключ и те, что можно кешировать в
                      шаблоне. Все.




                      ?php $demo->render(); ?>
Cache component
                      еализован ли внутри кеш? Не имеет
                      значения.
Инвалидация кеша




Кеширование должно быть простым
Инвалидация кеша




1. Лучше кешировать много мелких объектов,
чем внедрять сложную инвалидацию
Инвалидация кеша




2. Лучше инвалидировать больше, чем внедрять
сложную точечную инвалидацию
Инвалидация кеша




3. Логичное с точки зрения пользователя
приложение не потребует сложного кеширования
Инвалидация кеша
       search[title]           search[name]
                search[status]
search[price]
               pagesort_field       search[date]
 sort_order                       search[seller]
                user_id
Инвалидация кеша




     95%
Первая страница без параметров
Спасибо за внимание
        ВОпросы?
 Дмитрий Рычков, менеджер проектов
     rychkov.dmitry@gmail.com

CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить с психологом? (блиц-доклад)