Ответ
Redis (Remote Dictionary Server) — это высокопроизводительное in-memory хранилище данных типа «ключ-значение», которое используется в качестве базы данных, кэша, брокера сообщений и очереди.
Ключевые особенности:
- Высокая производительность: Так как данные хранятся в оперативной памяти, операции чтения и записи выполняются за микросекунды. Это идеально для задач, требующих минимальной задержки.
- Гибкие структуры данных: В отличие от простых хранилищ, Redis поддерживает строки, списки, хеши, множества (Sets) и упорядоченные множества (Sorted Sets).
- Персистентность (Persistence): Redis может сохранять данные на диск (снапшоты RDB или лог AOF), чтобы восстановить их после перезапуска.
- Атомарность операций: Большинство операций в Redis (например,
INCR
,LPUSH
) являются атомарными, что упрощает реализацию сложных механик, таких как счетчики или блокировки. - Встроенный механизм Pub/Sub: Позволяет реализовывать архитектуру «издатель-подписчик» для обмена сообщениями в реальном времени.
Основные сценарии использования:
- Кэширование: Снижение нагрузки на основную базу данных путем кэширования часто запрашиваемых данных.
- Управление сессиями: Хранение данных пользовательских сессий.
- Очереди задач: Использование списков Redis для организации фоновой обработки задач (background jobs).
- Счетчики и аналитика: Реализация счетчиков просмотров, лайков и другой аналитики в реальном времени с помощью атомарных инкрементов.
Пример кэширования в 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