voskobovich/yii2-linker-behavior

Сброс кеша при обновлении

Closed this issue · 3 comments

Есть у меня модель Base для объектов (отель, пансионат...) и Service (парк, бассейн, корт...) и связующая таблица {{%base_to_service}}.

Связь

public function getServices()
{
    return $this->hasMany(
        Service::className(),
        ['id' => 'service_id']
    )->viaTable(
        '{{%base_to_service}}',
        ['base_id' => 'id']
    );
}

Вывожу список объектов вместе с сервисами. Чтобы не дергать каждый раз сервисы - их кеширую через виджет.

Теперь, если изменить количество привязанных к объекту сервисов в админке, нужно инвалидировать кеш.

Как это лучше сделать?

Я не понимаю какое это отношение имеет к поведению, ну да ладно.

  1. Я бы ничего не кешировал без острой надобности, тем более в админке. Кеширование всегда дополнительные сложности.
  2. Раз уж кешируешь, то по событию изменения любой модели из списка инвалидируй кеш. Прямо в экшене сохранения изменений. Может поможет тегориваный кеш, в офф доке yii2 описано.

Но еще раз подчеркну - я бы ничего не кешировал без острой надобности. Может лучше стоит индексов добавить в табличку сервисов чтобы БД было проще их отдавать?

Имеет ).
Кеширую я на фронте. А в админке меняю привязки сервисов к объектув {{%base_to_service}}. Привязки эти обрабатывает поведение.

Кешировать приходится, т.к. выводится список объектов (150штук) с сервисами. Даже если join - ить, , все равно описание и каринки достаются через доп. запрос. Т.е. 150 лишних запросов

2017-03-13_12-54-11

Я предполагал так - В настройках updater добавить параметр cashKey. Если он задан - тогда по нему сбрасывать кеш, если в процессе работы поведения изменилось количество привязанных ссервисов к объекту.

А жадную загрузку используешь? Если ничего не помогает - тогда кеширование, либо по времени либо по любому другому признаку.
В зону ответственности поведения не входит инвалидация кеша.
Но если это не критично, можно и свой Updater напилить и заложить это в него)