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 логіка
Ні:
складні транзакції
довготривале зберігання критичних даних
