Урок 16: Кеширование в Laravel. Redis, Memcached, кеш запросов

В 16-ом уроке мы разберем одну из ключевых тем для оптимизации вашего приложения, это кеширование в Laravel. Кеширование позволяет ускорить работу сайта, уменьшить нагрузку на базу данных и сервер, а также улучшить пользовательский опыт.

В этом уроке мы научимся:

  1. Настраивать Redis и Memcached.
  2. Сохранять и получать данные из кеша.
  3. Кешировать запросы к базе данных.
  4. Очищать кеш через Artisan.

Также вас ждут практические задачи и примеры кода.

Настройка кеша: Redis и Memcached

Laravel поддерживает несколько драйверов кеширования: файловый, база данных, Memcached, Redis и другие.
Начнем с настройки самых популярных, Redis и Memcached.

Установка и настройка Redis

  1. Установите Redis на сервер:
    bash
    # Для Ubuntu/Debian
    sudo apt-get install redis-server
  2. Убедитесь, что Redis запущен:
    bash
    sudo systemctl status redis
  3. Установите пакет для работы с Redis в Laravel:
    bash
    composer require predis/predis
  4. В файле .env укажите драйвер кеша:
    env
    CACHE_DRIVER=redis
    REDIS_HOST=127.0.0.1
    REDIS_PORT=6379

Установка и настройка Memcached

  1. Установите Memcached:
    bash
    # Для Ubuntu/Debian
    sudo apt-get install memcached
    sudo apt-get install php-memcached
  2. Включите модуль Memcached в PHP:
    bash
    sudo phpenmod memcached
  3. В .env пропишите:
    env
    CACHE_DRIVER=memcached

Сохранение и получение данных из кеша

Работа с кешем в Laravel осуществляется через фасад Cache. Рассмотрим основные методы.

Сохранение данных

  • Простое сохранение:
    php
    minate\Support\Facades\Cache;
    
    Cache::put('ключ', 'значение', $seconds = 60); // Хранится 60 секунд
  • Сохранение навсегда:
    php
    Cache::forever('ключ', 'значение');
  • Добавление, если ключа нет:
    php
    Cache::add('уникальный_ключ', 'данные', 120); // Добавится, только если ключ не существует

Получение данных

  • Получить значение:
    php
    $value = Cache::get('ключ');
  • Получить значение или вернуть по умолчанию:
    php
    $value = Cache::get('ключ', 'значение_по_умолчанию');
  • Получить и удалить:
    php
    $value = Cache::pull('ключ');

Пример: Кеширование данных пользователя

php
public function getUser($userId) {
    return Cache::remember('user_' . $userId, 60 * 5, function () use ($userId) {
        return User::find($userId); // Запрос выполнится, только если данных нет в кеше
    });
}

Метод remember сначала проверяет кеш. Если данных нет — выполняет замыкание и сохраняет результат.

Кеширование запросов к базе данных

Один из самых эффективных способов ускорить приложение, это кешировать результаты тяжелых SQL-запросов.

Используем метод cache()

Laravel позволяет кешировать запросы прямо в Eloquent:

php
$users = User::where('active', true)
    ->orderBy('created_at', 'desc')
    ->cache(now()->addMinutes(10)) // Кешируем на 10 минут
    ->get();

Кеширование с тегами (только для Redis/Memcached)

Теги позволяют группировать кеш и очищать его по категориям:

php
Cache::tags(['users', 'posts'])->put('ключ', $data, 600);

// Очистка всех данных с тегом 'users'
Cache::tags('users')->flush();

Очистка кеша через Artisan

Управлять кешем можно через консольные команды.

Основные команды

  • Очистить весь кеш:
    bash
    php artisan cache:clear
  • Очистить кеш конфигурации:
    bash
    php artisan config:clear
  • Очистить кеш маршрутов:
    bash
    php artisan route:clear
  • Очистить кеш представлений:
    bash
    php artisan view:clear

Пример: Очистка кеша при обновлении данных

Допустим, при изменении профиля пользователя мы хотим обновить кеш:

php
public function updateProfile($userId, $data) {
    User::find($userId)->update($data);
    Cache::forget('user_' . $userId); // Удаляем старый кеш
}

Практические задачи

Закрепим знания на практике!

Задача 1: Настройте Redis

  1. Установите Redis на локальную машину.
  2. Настройте Laravel для работы с Redis.
  3. Создайте маршрут /test-redis, который сохраняет в кеш строку «Hello Redis» и возвращает ее.

Решение:

php
// routes/web.php
Route::get('/test-redis', function () {
    Cache::put('test_message', 'Hello Redis', 60);
    return Cache::get('test_message');
});

Задача 2: Кешируйте популярные посты

Допустим, у вас есть модель Post. Закешируйте 10 самых популярных постов на 30 минут.

Решение:

php
$posts = Post::orderBy('views', 'desc')
    ->take(10)
    ->cache(now()->addMinutes(30))
    ->get();

Итоги 16-го урока

Теперь вы умеете работать с кешем в Laravel. Это мощный инструмент, который сделает ваше приложение быстрее и стабильнее. Не забывайте также об кеширование, используйте его там, где данные редко меняются, а запросы ресурсоемки.

Полный курс по Laravel для начинающих