ErickSkrauch
@ErickSkrauch

Реализовать глобальное кэширование данных в Yii2?

Планирую переписывать проект с PhalconPHP на Yii2. Не вдаваясь в подробности, почему меняю фреймворк, спрошу вот что:

Как в Yii2 можно реализовать глобальное кэширование сущностей?

Пояснение:
Возьмём сущность User. У User есть аватарка Skin. Они связаны. У Skin есть uploader, т.е. тот, кто её загрузил и, как ни странно, это User. За тем у нас идут более комплексные сущности: Comment и Post (на самом деле их больше). Comment содержит author, а для вывода на frontend (или ответа по API) нам всегда нужен и Skin, ибо как же нам без аватарки. У сущности Post есть такой же author и для нормальной работы нужны всё те же данные. Отсюда получается, что для выборки постов всегда будет использоваться Post::find()->with('author', 'author.skin')->all(). А это значит, что у нас постоянно будут следующие запросы:

SELECT * FROM posts
SELECT * FROM users WHERE id IN (...)
SELECT * FROM skins WHERE id IN (...)


И проблему можно было бы как-то решить, если бы просто-напросто в месте объявления связи (том самом геттере, который возвращается ActiveQuery) добавить ->cache(), но это будет кэш только для строго совпадающего набора id, что, по сути, бессмысленно.

Пока мой проект работает на PhalconPHP, я написал внешний класс, который делает примерно следующее: ищет переданные id сущностей в кэше, что может тянет оттуда, а остаток выбирает и кэширует. Так же у меня есть глобальная система тэгирования, кэширование на уровне findFirst() и подобных, но всё же, если честно, это всё больше походит на быдлокод, чем на "крутое решение".

Так вот, продолжу про задачу: на сайте так же существует отдельная страница аватарки и пользователя. И там так же используются эти сущности, вот прям по id. То есть получается, что по сути сущности всегда одинаковые, а за счёт тегирования кэша (что пока тоже для меня загадка в Yii2) ttl у кэша может быть близким к бесконечности.

Из всего вышесказанного вытекают следующие вопросы (более конкретезированные):
  • Как реализовать кэширование для findFirst() по сущности и тегам? Тут, конечно, решение напрашивается вполне очевидное, но всё же мб кто-то предложит очень красивый вариант.
  • Как реализовать более умную выборку связанных данных, а именно проверку сущностей в кэше, довыборку оставшихся и дальнейшее их кэширование?
  • Вопрос задан
  • 613 просмотров
Пригласить эксперта
Ответы на вопрос 1
SamDark
@SamDark
Yii2 core team
1. Тегирование кеша есть. См. yii\caching\TagDependency.
2. Посмотрите на www.yiiframework.com/doc-2.0/guide-db-active-recor...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы