Когда дело доходит до ускорения приложения, то лучшее решение — это кэширование. Laravel поставляется с уже готовыми кэш-драйверами: Redis, Memcached или просто локальные файлы.
Но в этот раз мы поговорим о кешировании запросов Eloquent напрямую из моделей, что значительно упростит кэширование данных!
Пакет можно найти на GitHub. И, хотя, в документации раскрыты все основные моменты работы пакета, но, в этой статье, мы также познакомимся с основами кэширования и очистки кэша.
Установка
Пакет можно установить через Composer:
$ composer require rennokki/laravel-eloquent-query-cache
Вашим моделям потребуется трейт QueryCacheable
:
use Rennokki\QueryCache\Traits\QueryCacheable; class Article extends Model { use QueryCacheable; ... }
Включаем режим кэширования по умолчанию
По умолчанию пакет не кэширует запросы. Вам нужно добавить переменную $cacheFor
в модель:
use Rennokki\QueryCache\Traits\QueryCacheable; class Article extends Model { use QueryCacheable; protected $cacheFor = 180; // 3 минуты }
Каждый раз, как запускается запрос, то проверяется кеш, и в случае, если он пуст, то заполняется, чтобы в следующий выдать данные уже из кэша; если же в кэше уже есть данные, то они извлекаются без обращения к базе данных.
// запрос к БД; результат сохранен в кэше Article::latest()->get(); // запроса к БД не было; результат был получен из кэша Article::latest()->get();
Если вы хотите избежать кеширования, то можно использовать ->dontCache()
перед последним методом.
Article::latest()->dontCache()->firstOrFail();
Включение кеширование по запросу
Альтернативой является включение кэширования по запросу, если дефолтное кэширование вам не подходит.
Прежде всего, удалите переменную $cacheFor
из вашей модели.
Для каждого запроса вы можете вызвать ->cacheFor(...)
, чтобы указать, что вы хотите кэшировать этот запрос.
Article::cacheFor(now()->addHours(24))->paginate(15);
Улучшенная организация с помощью тегов
Некоторые кеш-хранилища, такие как Redis или Memcached, поддерживают тегирование ключей. Это полезно, так как мы можем пометить наши запросы в кеше и, при необходимости, очистить нужный кеш.
В качестве простого примера, это может пригодится, если мы хотим очистить кэш списка статей, при обновлении одной из них.
$articles = Article::cacheFor(60)->cacheTags(['latest:articles'])->latest()->get(); $article = Article::find($id); $article->update(['title' => 'My new title']); Article::flushQueryCache(['latest:articles']);
Метод flushQueryCache
инвалидирует только кэши с тегом latest:articles
. Если у нас есть другие кэши, помеченные иными тегами, то они сохранятся.
Копаем глубже
Подробнее об этом пакете можно узнать на странице проекта на GitHub.
Автор: Alex Renoki
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.