Ответ
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 (лог операций).