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

Ответ

В моих проектах 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.

Ответ 18+ 🔞

Слушай, а вот про Redis — это вообще отдельная песня, ебать мои старые костыли. В моих проектах он обычно крутился на двух фронтах: либо как супербыстрый кэш, либо как такая хитрая жопа из структур данных, на которой можно кучу механизмов построить.

1. Кэширование (тут всё понятно, основная работа):

  • Кэш для тяжёлых запросов к базе. Ну там, список топовых товаров или какая-нибудь сводная статистика, которую каждый раз заново считать — терпения ноль ебать.
  • Кэш для кусков страниц. В том же Laravel или Symfony — закешировал блок, и всё, не надо шаблоны каждый раз рендерить.
  • Сессии. Ну это классика, ёпта. Чтобы при масштабировании пользователи не терялись, как слепые котята.
// Пример кэширования с использованием 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). Онлайн-пользователи, лайки, ограничение запросов — идеально, всё атомарно.
  • Блокировки (SET с NX/EX). Распределённые блокировки, чтобы два процесса в одну критическую секцию не влезли, как гомосеки налетели.
  • Геоданные (GEO). Один раз делал поиск ближайших точек — работает, ни хуя себе, быстро.
  • Sorted Sets. Для рейтингов, топ-10 игроков — просто пизда рулю.

По администрированию и оптимизации:

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