Ответ
Я использовал Redis как высокопроизводительное in-memory key-value хранилище для решения следующих задач:
- Кеширование: Снижение нагрузки на основную базу данных (например, PostgreSQL) путем кеширования часто запрашиваемых данных: ответов API, результатов сложных запросов, данных о пользователях.
- Управление сессиями: Хранение токенов сессий пользователей. Redis обеспечивает быстрый доступ к данным сессии, что критично для аутентификации и авторизации.
- Очереди задач (Message Broker): Использование списков Redis (
LPUSH
/BRPOP
) для создания простых фоновых очередей задач. Например, для отправки email-уведомлений, обработки изображений или других отложенных операций. - Rate Limiting: Реализация ограничителя частоты запросов к API. Атомарные операции Redis (например,
INCR
) идеально подходят для создания счетчиков запросов с временем жизни (TTL). - Pub/Sub: Для систем реального времени, например, для рассылки уведомлений всем подключенным клиентам через WebSocket.
Пример кеширования в Go с go-redis
:
import (
"context"
"time"
"github.com/go-redis/redis/v8"
)
// client - это экземпляр *redis.Client
func getUserFromCache(ctx context.Context, client *redis.Client, userID string) (string, error) {
key := "user:" + userID
// Пытаемся получить из кеша
val, err := client.Get(ctx, key).Result()
if err == redis.Nil {
// В кеше нет, получаем из БД
// dbValue := ...
// client.Set(ctx, key, dbValue, 10*time.Minute)
return "", nil // Пример
} else if err != nil {
return "", err
}
return val, nil
}
Ключевые возможности Redis, которые я применял:
- Высокая производительность за счет хранения данных в оперативной памяти.
- Разнообразные структуры данных: Не только строки, но и списки (Lists), хеши (Hashes), множества (Sets), что позволяет моделировать сложные сущности.
- Атомарные операции: Гарантируют целостность данных при конкурентном доступе (например,
INCR
,SETNX
). - Время жизни ключей (TTL): Автоматическое удаление устаревших данных из кеша.
- Персистентность: Возможность сохранять данные на диск (RDB и AOF) для восстановления после сбоев.