Redis: не только кэширование
Большинство разработчиков используют Redis как быстрый key-value кэш. Но это только вершина айсберга. Redis – это универсальный in-memory инструмент, который отлично подходит для построения высоконагруженных систем. В этой статье рассмотрим практические сценарии использования Redis с примерами кода.
Игорь Кривошей
Специалист по разработке и DevOps

1. Очереди (Queues)
Redis идеально подходит для реализации простых очередей задач.
Использование: background jobs, обработка событий
Основные команды:
LPUSH- добавить в очередьRPOP/BLPOP— получить из очереди
Пример (Node.js + ioredis)
import Redis from 'ioredis';
const redis = new Redis();
// Producer (додає задачу)
async function addJob(data) {
await redis.lpush('queue:emails', JSON.stringify(data));
}
// Worker (обробляє задачі)
async function worker() {
while (true) {
const res = await redis.brpop('queue:emails', 0);
const job = JSON.parse(res[1]);
console.log('Processing:', job);
}
}
worker();Плюсы:
Простота
Мгновенная обработка
Минус:
Нет retry/ack (для более сложных кейсов лучше BullMQ)
2. Pub/Sub (Publish/Subscribe)
Redis позволяет реализовать систему сообщений в реальном времени.
Использование: чаты, нотификации, WebSocket
Пример
// subscriber.js
const sub = new Redis();
sub.subscribe('chat');
sub.on('message', (channel, message) => {
console.log(`New message: ${message}`);
});// publisher.js
const pub = new Redis();Особенность:
Сообщения не сохраняются (это не очередь!)
3. Rate Limiting (ограничение запросов)
Один из самых популярных кейсов – защита API.
Использование:
защита от DDoS
ограничение запросов пользователя
Пример (Fixed Window)
async function rateLimit(ip) {
const key = `rate:${ip}`;
const current = await redis.incr(key);
if (current === 1) {
await redis.expire(key, 60); // 60 сек
}
if (current > 100) {
throw new Error('Too many requests');
}
}Альтернатива:
Sliding window (более точный контроль)
Token bucket (для API)
4. Сессии пользователей
Redis часто используют в качестве storage для сессий.
Использование:
авторизация
shopping cart
временные данные
Пример
// збереження сесії
await redis.set(
`session:${sessionId}`,
JSON.stringify({ userId: 123 }),
'EX',
3600
);
// отримання
const session = JSON.parse(
await redis.get(`session:${sessionId}`)
);Плюсы:
быстро
TTL "из коробки"
5. Геопространственные данные (Geo)
Redis имеет встроенную поддержку геоданных.
Использование:
поиск "рядом со мной"
доставка
карты
Команды:
GEOADDGEORADIUSGEODIST
Пример
// додаємо координати
await redis.geoadd('drivers', 30.5234, 50.4501, 'driver_1');
// шукаємо поруч (5 км)
const nearby = await redis.georadius(
'drivers',
30.5234,
50.4501,
5,
'km'
);
console.log(nearby);6. Счетчики и аналитика
Redis отлично подходит для real-time метрик.
Использование:
просмотры страниц
лайки
аналитика
Пример
await redis.incr('page:home:views');Или из TTL:
await redis.incr('stats:today');
await redis.expire('stats:today', 86400);7. Distributed Locks (распределенные блокировки)
Для синхронизации между сервисами.
Использование:
избегание race conditions
cron jobs
Пример
const lock = await redis.set('lock:job', '1', 'NX', 'EX', 10);
if (lock) {
console.log('Lock acquired');
// виконуємо задачу
}Вывод
Redis – это не просто кэш, а мощный инструмент для построения:
высоконагруженных API
асинхронных систем
real-time приложений
геосервисов
Если ты используешь Redis только для кэша – ты используешь ~20% его возможностей.
Когда следует использовать Redis
Да:
нужна скорость (миллисекунды)
временные или часто изменяемые данные
real-time логика
Нет:
сложные транзакции
длительное хранение критических данных
