Что такое Redis и каковы его основные сценарии использования в бэкенде?

Ответ

Redis (Remote Dictionary Server) — это высокопроизводительное in-memory хранилище данных типа «ключ-значение», которое используется в качестве базы данных, кэша, брокера сообщений и очереди.

Ключевые особенности:

  • Высокая производительность: Так как данные хранятся в оперативной памяти, операции чтения и записи выполняются за микросекунды. Это идеально для задач, требующих минимальной задержки.
  • Гибкие структуры данных: В отличие от простых хранилищ, Redis поддерживает строки, списки, хеши, множества (Sets) и упорядоченные множества (Sorted Sets).
  • Персистентность (Persistence): Redis может сохранять данные на диск (снапшоты RDB или лог AOF), чтобы восстановить их после перезапуска.
  • Атомарность операций: Большинство операций в Redis (например, INCR, LPUSH) являются атомарными, что упрощает реализацию сложных механик, таких как счетчики или блокировки.
  • Встроенный механизм Pub/Sub: Позволяет реализовывать архитектуру «издатель-подписчик» для обмена сообщениями в реальном времени.

Основные сценарии использования:

  1. Кэширование: Снижение нагрузки на основную базу данных путем кэширования часто запрашиваемых данных.
  2. Управление сессиями: Хранение данных пользовательских сессий.
  3. Очереди задач: Использование списков Redis для организации фоновой обработки задач (background jobs).
  4. Счетчики и аналитика: Реализация счетчиков просмотров, лайков и другой аналитики в реальном времени с помощью атомарных инкрементов.

Пример кэширования в Go:

// Подключаемся к Redis
client := redis.NewClient(&redis.Options{Addr: "localhost:6379"})

key := "user:123:profile"

// Пытаемся получить данные из кэша
val, err := client.Get(ctx, key).Result()
if err == redis.Nil {
    // Если в кэше нет, получаем из БД
    val = getDataFromDB("123") 
    // Сохраняем в кэш на 10 минут
    client.Set(ctx, key, val, 10*time.Minute)
} else if err != nil {
    panic(err)
}
// Используем val