Как вы используете Redis и для каких задач?

Ответ

В своих проектах я применял Redis как высокопроизводительное in-memory хранилище данных для нескольких ключевых сценариев:

  1. Кэширование: Самый частый случай. Кэширую результаты тяжёлых SQL-запросов, вычислений или ответов внешних API.

    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $cacheKey = 'user_profile:' . $userId;
    
    if ($data = $redis->get($cacheKey)) {
        return unserialize($data); // Данные из кэша
    }
    
    $data = fetchUserProfileFromDb($userId); // Дорогой запрос к БД
    $redis->setex($cacheKey, 300, serialize($data)); // Кэшируем на 5 минут
    return $data;
  2. Хранение сессий: Настройка PHP для хранения сессионных данных в Redis (session.save_handler = redis) позволяет сделать приложение stateless и легко масштабировать.
  3. Очереди задач: Использовал структуры данных вроде List для реализации простой очереди задач (например, для отложенной отправки email). Более продвинутый вариант — Redis Streams для гарантированной доставки сообщений.
  4. Счётчики и рейтинги: Благодаря атомарным командам INCR, HINCRBY удобно хранить счётчики просмотров, лайков, онлайн-пользователей.
  5. Pub/Sub для событий: Реализовывал простые системы уведомлений в реальном времени, где один сервис публиковал событие (PUBLISH), а другие подписывались (SUBSCRIBE) на его обработку.

Выбор конкретного сценария зависит от требований к скорости, объёму данных и необходимости их персистентности.

Ответ 18+ 🔞

А, блядь, про Redis! Ну это же, ёпта, просто песня, а не инструмент. Я его в проектах таскаю, как швейцарский нож — на все случаи жизни, от мелких царапин до капитальных распилов.

Вот, например, самый хлебный вариант — кэширование. Ну а чё, сидит у тебя какой-нибудь монструозный SQL-запрос, который жрёт ресурсов, как не в себя, и тормозит, как черепаха в патруле. Так зачем его каждый раз гонять? Берёшь, выковыриваешь результат, и — хоба! — пихаешь в Redis. Следующий раз просто вытаскиваешь оттуда, и всё, скорость — овердохуища. Смотри, как просто:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$cacheKey = 'user_profile:' . $userId;

if ($data = $redis->get($cacheKey)) {
    return unserialize($data); // Данные из кэша
}

$data = fetchUserProfileFromDb($userId); // Дорогой запрос к БД
$redis->setex($cacheKey, 300, serialize($data)); // Кэшируем на 5 минут
return $data;

Второй классический финт — сессии. Ну серьёзно, хранить их в файлах — это как будто на дворе 2002-й год. Настраиваешь PHP, чтоб он всё это добро слал прямиком в Redis, и получаешь stateless-приложение, которое можно масштабировать, не бздя, что пользователя разлогинит. Удобно, блядь.

А ещё я его в очереди задач пихал. Ну там, отложенная отправка писем, какая-нибудь фоновая обработка. Берёшь обычный List, пихаешь туда задачи одной стороной, выковыриваешь другой — и порядок. Если хочется поумничать и надёжности, то есть же Redis Streams, там уже с гарантией доставки, всё по-взрослому.

Для счётчиков он вообще идеален. Просмотры, лайки, онлайн-юзеры — всё это можно инкрементить атомарными командами вроде INCR. Никаких гонок, никаких костылей, одна радость.

Ну и вишенка на торте — Pub/Sub. Нужно было как-то раз сделать простенькую систему событий в реальном времени. Один сервис крикнул PUBLISH, другие, кто подписан (SUBSCRIBE), — услышали и отреагировали. Проще пареной репы, а работает — загляденье.

Короче, инструмент — огонь. Главное — понимать, для чего он, а для чего нет. Если тебе нужно хранить терабайты данных на века — это не сюда, тут всё-таки память, ёпта. А вот если нужна скорость, простота и надёжность для горячих данных — то хуй с горы, бери Redis, не прогадаешь.