Расскажи про свой опыт работы с Redis

«Расскажи про свой опыт работы с Redis» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моих проектах Redis выступал в двух основных ролях: как высокопроизводительное кэш-хранилище и как структура данных для реализации различных механизмов.

1. Кэширование (основное использование):

  • Кэширование результатов тяжелых запросов к БД. Например, список популярных товаров или агрегированная статистика.
  • Кэширование фрагментов страниц (Blade-шаблоны в Laravel, Twig в Symfony).
  • Сессии. Хранение сессий в Redis — стандартная практика для горизонтального масштабирования приложения.
// Пример кэширования с использованием Predis в Laravel/Symfony
$redis = new PredisClient('tcp://127.0.0.1:6379');

$userId = 123;
$cacheKey = "user_profile:{$userId}";

// Пытаемся получить данные из кэша
$cachedData = $redis->get($cacheKey);

if ($cachedData === null) {
    // Кэш-промах: идем в базу
    $userData = $entityManager->find(User::class, $userId);
    $cachedData = json_encode($userData);
    // Сохраняем на 1 час
    $redis->setex($cacheKey, 3600, $cachedData);
}

return json_decode($cachedData, true);

2. Использование структур данных:

  • Очереди (Lists): Для простых фоновых задач (логирование, синхронизация).
  • Счетчики (INCR/DECR): Для подсчета онлайн-пользователей, количества лайков, ограничения запросов (Rate Limiting).
  • Блокировки (SET с NX/EX): Для реализации распределенных блокировок при обработке критических операций.
  • Геопространственные данные (GEO): В одном проекте использовал для поиска ближайших объектов по координатам.
  • Sorted Sets: Для реализации лидербордов (топ-10 игроков).

Администрирование и оптимизация:

  • Настраивал политику вытеснения (maxmemory-policy allkeys-lru) при ограничении памяти.
  • На production использовал репликацию Master-Slave для повышения отказоустойчивости и чтения реплик для разгрузки мастера.
  • Мониторил метрики (использование памяти, количество команд в секунду) через redis-cli --stat и инструменты вроде RedisInsight.