Какие типы данных поддерживает Redis и в каких сценариях их применяют?

Ответ

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

Тип данных Описание Типичный сценарий использования Пример команды (Redis CLI)
String Простая пара ключ-значение. Может быть строкой, числом или бинарными данными. Кэширование HTML-фрагментов, счетчики, сессии. SET user:1000 "John" INCR page_views
List Список строк, упорядоченный по порядку вставки. Поддерживает операции с головы и хвоста. Очереди задач (FIFO), лента новостей (LIFO). LPUSH tasks "task1" RPOP tasks
Set Неупорядоченная коллекция уникальных строк. Поддерживает пересечения, объединения. Хранение тегов, уникальных посетителей страницы, «друзей» пользователя. SADD article:123:tags "tech" "redis"
Hash Карта полей и значений (как объект). Идеален для представления объектов. Хранение данных пользователя (имя, email, баллы) в одном ключе. HSET user:1000 name "John" age 30
Sorted Set (Zset) Set, где каждый элемент имеет числовой score для сортировки. Рейтинги, лидерборды, временные линии с сортировкой по дате. ZADD leaderboard 1500 "player1"
Bitmap Массив битов. Операции на уровне битов очень эффективны по памяти. Статистика посещений за день (бит на пользователя), анализ аудитории. SETBIT visits:2024-01-01 100 1
HyperLogLog Вероятностная структура для подсчета уникальных элементов с минимальной памятью. Подсчет уникальных посещений страницы за день с допустимой погрешностью ~1%. PFADD visitors:day "192.168.1.1"
Stream (с Redis 5.0) Лог-ориентированная структура, похожая на Kafka topic. Асинхронная обработка событий, аудит-логи, обмен сообщениями между микросервисами. XADD orders * user_id 1000 status paid

На практике я часто комбинирую типы. Например, для кэша страницы — String, для корзины покупок — Hash, а для топ-10 товаров — Sorted Set.

Ответ 18+ 🔞

А, ну вот, смотри, тут про Redis тебе рассказывают, а ты сидишь и думаешь: "Ну key-value и key-value, хуй с горы, что там сложного?" А нихуя! Это же не просто словарь тупой, это целый ёперный театр структур данных, каждая под свою задачу заточена. Сейчас разжую, как есть.

Вот смотри на эту таблицу, она, блядь, полезная, хоть и скучная на вид. Типы данных там — это не просто так.

String — это основа основ, классика. Ключ и значение, будь то текст, число или даже бинарник. Кэшируешь там кусок HTML, считаешь просмотры — идеально. SET user:1000 "Vasya", INCR views — просто и понятно. Но если на этом остановиться, то ты, прости, манда с ушами.

List — это уже очередь, чувак. Представь список, куда можно пихать элементы и с начала, и с конца. Задачи в очередь положил (LPUSH tasks "send_email") — другой процесс вытащил и обработал (RPOP tasks). Или ленту новостей сделать в стиле стека. Уже веселее.

Set — это когда уникальность важна. Хранишь там теги к статье, ID уникальных юзеров, которые зашли на страницу. Команды для пересечения и объединения — просто песня, можно крутые выборки делать. SADD tags:123 "programming" "redis".

Hash — о, это моя любовь. Представь себе объект. Вместо того чтобы плодить кучу ключей user:1000:name, user:1000:email, ты складываешь всё в одну структуру: HSET user:1000 name "Ivan" email "ivan@mail.ru". Чисто, аккуратно, в одном месте. Для корзины покупок или профиля — то, что надо.

Sorted Set (Zset) — вот тут начинается магия. Это как Set, но у каждого элемента есть вес (score). И они по этому весу сортируются. Лидерборды в игре, рейтинги товаров, временная шкала — это всё сюда. ZADD leaderboard 1500 "player_alpha". Потом запросишь топ-10 — и тебе красиво отдаст.

Bitmap и HyperLogLog — это уже для спецов, которые памятью помешаны. Bitmap — битовый массив, дохуя эффективный. Отметил, что пользователь с ID 1000 зашел (SETBIT visits:2024-01-01 1000 1) — и всё, один бит потратил. HyperLogLog — это вообще чёрная магия: считает уникальные элементы с погрешностью, но памяти жрёт овердохуища меньше. Для примерных подсчётов уникальных визитов — идеально.

Stream (появился в 5.0) — это уже серьёзная тема для асинхронщины, типа своего Кафки внутри Redis. События, логи, сообщения между сервисами — XADD orders * user_id 555 status "shipped".

Так что, суть в чём? Умный человек не тыкает всё в String. Он смотрит на задачу. Кэш страницы — String. Корзина — Hash. Топ товаров — Sorted Set. Собрал такую систему — и она летает, а не ползёт, как улитка после дождя. Вот и вся философия, если в двух словах.