DevOps

Redis: не только кэширование

Расширенные сценарии использования Redis: очереди, pub/sub, rate limiting, сессии и геопространственные данные.

ИК

Игор Кривошей

Full-stack инженер

28 лютого 2026 р.·10 мин
Redis: не только кэширование

За пределами простого кэширования

Redis — это не просто быстрое хранилище ключ-значение. Это многофункциональная платформа данных.

Очереди сообщений

Redis Streams (рекомендуется)

JAVASCRIPT
// Producer
await redis.xadd('orders', '*', {
  'order_id': '123',
  'status': 'pending'
});

// Consumer
const messages = await redis.xreadgroup(
  'GROUP', 'workers', 'worker-1',
  'STREAMS', 'orders', '>'
);

Pub/Sub для real-time

JAVASCRIPT
// Publisher
redis.publish('notifications', JSON.stringify({
  userId: 123,
  message: 'New order!'
}));

// Subscriber
redis.subscribe('notifications');
redis.on('message', (channel, message) => {
  console.log('Received:', message);
});

Rate Limiting

Гибкая защита от превышения лимитов:

LUA
-- Sliding window rate limiting
local key = KEYS[1]
local window = tonumber(ARGV[1])
local limit = tonumber(ARGV[2])
local now = redis.call('TIME')[1]

redis.call('ZREMRANGEBYSCORE', key, 0, now - window)
local count = redis.call('ZCARD', key)

if count < limit then
  redis.call('ZADD', key, now, now)
  redis.call('EXPIRE', key, window)
  return 1
end
return 0

Сессии пользователей

Почему Redis для сессий?

  • Атомарные операции — race condition-защищенно
  • TTL из коробки — автоматическая очистка
  • Репликация — доступность при отказе
JAVASCRIPT
// Сохранение сессии
await redis.hset('session:abc123', {
  userId: 456,
  cart: JSON.stringify(items)
});
await redis.expire('session:abc123', 3600);

Геопространственные данные

Поиск по радиусу для геосервисов:

Bash
# Добавление локаций
GEOADD stores 30.5234 50.4501 "Kyiv Store"
GEOADD stores 36.2304 49.9935 "Kharkiv Store"

# Поиск в радиусе 100км
GEORADIUS stores 30.5234 50.4501 100 km WITHDIST

Bloom filters

RedisBloom модуль для probabilistic data structures:

Bash
# Создание фильтра
BF.RESERVE seen_urls 0.01 1000000

# Проверка существования
BF.EXISTS seen_urls "https://example.com"

# Добавление
BF.ADD seen_urls "https://new-site.com"

Векторный поиск

RedisSearch для semantic search:

Bash
# Создание индекса
FT.CREATE idx ON HASH SCHEMA
  title TEXT
  embedding VECTOR HNSW 6 DIM 1536 DISTANCE_METRIC COSINE

# Векторный поиск
FT.SEARCH idx "*=>[KNN 10 @embedding $vec]" 
  PARAMS 2 vec "<binary_embedding>"

Мониторинг Redis

Ключевые метрики:

  • memory_used — использование памяти
  • connected_clients — активные соединения
  • instantaneous_ops_per_sec — операций в секунду
  • keyspace_hits/misses — эффективность кэша

Заключение

Redis — это полноценная платформа данных, а не просто кэш. Правильное использование:

  • Ускоряет приложение в 10-100 раз
  • Снижает нагрузку на основную БД
  • Включает real-time функциональность
  • Упрощает архитектуру системы
Теги
RedisBackendPerformanceCaching

Shipstack

Готовы внедрить это на практике?

Обсудим архитектуру, сроки и стек — без шаблонных презентаций, по делу.