Ответ
В моих проектах 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, чтобы видеть, сколько памяти жрёт и не накрылся ли он медным тазом.