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