Кэширование запросов Eloquent

Кэширование запросов Eloquent

Когда дело доходит до ускорения приложения, то лучшее решение — это кэширование. 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
Перевод: Demiurge Ash