Какие типы данных поддерживает Redis для хранения?

«Какие типы данных поддерживает Redis для хранения?» — вопрос из категории Базы данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Redis — это хранилище структур данных (data structure store), а не просто key-value хранилище. Ключ всегда является строкой, а значение может быть одного из следующих типов:

Тип Описание Пример использования
String Простейший тип: строка, целое число или бинарные данные (до 512 МБ). Кэширование HTML, счетчики, флаги.
List Список строк, упорядоченный по порядку вставки. Поддерживает операции с обеих сторон (двусторонняя очередь). Очередь задач (FIFO), лента новостей.
Set Неупорядоченная коллекция уникальных строк. Поддерживает пересечения, объединения. Теги, уникальные посетители, «друзья».
Sorted Set (ZSet) Set, где каждый элемент имеет числовой score для сортировки. Элементы уникальны, score могут повторяться. Рейтинги, лидерборды, временные шкалы.
Hash Коллекция пар field-value (аналог словаря или объекта). Идеален для представления объектов. Хранение профиля пользователя (user:123 -> {name: "Alice", age: 30}).
Stream Лог-ориентированная структура, добавленная в Redis 5.0. Сообщения имеют ID и состоят из пар ключ-значение. Очередь событий (event sourcing), аудит-лог.
Bitmap Расширение типа String для битовых операций (установка/получение бита по индексу). Статистика онлайн-пользователей за день, флаги фич.
HyperLogLog Вероятностная структура для оценки количества уникальных элементов с минимальной памятью (погрешность ~0.81%). Подсчет уникальных поисковых запросов за день.
Geospatial Надстройка над Sorted Set для хранения координат (широта/долгота) и выполнения геопоиска. Поиск ближайших точек интереса.

Примеры команд и кода:

# String (кэширование)
> SET page:home "<html>..." EX 60
> GET page:home

# Hash (объект пользователя)
> HSET user:1000 name "John" age 30 email "john@doe.com"
> HGETALL user:1000

# Sorted Set (лидерборд)
> ZADD leaderboard 1500 "player1"
> ZADD leaderboard 1700 "player2"
> ZREVRANGE leaderboard 0 2 WITHSCORES # Топ-3
// Пример на C# с использованием StackExchange.Redis
IDatabase db = redis.GetDatabase();

// Работа с Hash
await db.HashSetAsync("user:1000", new HashEntry[] {
    new("name", "John"),
    new("age", 30)
});
var user = await db.HashGetAllAsync("user:1000");

// Работа с Sorted Set (добавление и получение топа)
await db.SortedSetAddAsync("leaderboard", "player1", 1500);
var topPlayers = await db.SortedSetRangeByRankWithScoresAsync("leaderboard", 0, 2, Order.Descending);

Важно: Все данные Redis по умолчанию хранятся в оперативной памяти (in-memory), что обеспечивает высокую скорость. Для персистентности можно настроить RDB (снимки) или AOF (лог операций).