middle
Какие структуры данных поддерживает Redis?
Redis поддерживает набор высокоуровневых структур данных, каждая из которых оптимизирована под определённый класс задач, что отличает его от простых key-value хранилищ типа Memcached.
Основные структуры данных
| Структура | Команды | Применение |
|---|---|---|
| String | SET, GET, INCR, DECR, MGET |
Кэш, счётчики, сессии |
| Hash | HSET, HGET, HGETALL, HDEL |
Объекты (user:1 -> {name, email, age}) |
| List | LPUSH, RPUSH, LPOP, LRANGE |
Очереди, последние N элементов |
| Set | SADD, SMEMBERS, SINTER, SUNION |
Теги, уникальные значения, пересечения |
| Sorted Set | ZADD, ZRANGE, ZRANK, ZRANGEBYSCORE |
Рейтинги, таймлайны, приоритетные очереди |
| Stream | XADD, XREAD, XREADGROUP |
Event streaming, лог событий, очереди задач |
| HyperLogLog | PFADD, PFCOUNT, PFMERGE |
Подсчёт уникальных значений (approximate) |
| Bitmap | SETBIT, GETBIT, BITCOUNT |
Флаги, онлайн-статус, daily active users |
Практические примеры
Пример кода
# String — кэш с TTL
SET user:1 '{"name":"John","email":"john@mail.com"}' EX 600
# Hash — отдельные поля
HSET user:1 name "John" email "john@mail.com" age 30
HGET user:1 name # → "John"
# Sorted Set — leaderboard
ZADD leaderboard 100 "player1" 200 "player2" 150 "player3"
ZREVRANGE leaderboard 0 2 WITHSCORES # топ-3
# List — последние 10 уведомлений
LPUSH notifications:user:1 '{"text":"Новый заказ","time":"..."}'
LTRIM notifications:user:1 0 9 # оставить только последние 10
# HyperLogLog — уникальные посетители (приблизительно, погрешность <1%)
PFADD visitors:2026-04-22 "user1" "user2" "user3"
PFCOUNT visitors:2026-04-22 # → 3
# Stream — event log
XADD orders * orderId 123 status created
XREAD COUNT 10 STREAMS orders 0 # читать с начала
Как выбрать структуру
- Кэш объектов целиком — String (сериализованный JSON)
- Кэш с доступом к отдельным полям — Hash (можно читать/обновлять одно поле без десериализации)
- Рейтинги, лидерборды — Sorted Set (O(log N) для add/remove/rank)
- Очереди с гарантией доставки — Stream (consumer groups, acknowledgment)
- Простые очереди — List (LPUSH/RPOP)
- Уникальные элементы и пересечения — Set
- Подсчёт уникальных (approximate) — HyperLogLog (12 KB на любое количество элементов)
Частые ошибки
- String для объектов вместо Hash — каждое обновление одного поля требует перезаписи всего JSON
- List вместо Stream для очередей — Stream поддерживает consumer groups и acknowledgment, List — нет
- Set для больших коллекций —
SMEMBERSвозвращает все элементы разом; для больших коллекций используйтеSSCAN
Как используется в 2026
- Redis Streams заменяют простые очереди на List
- RedisJSON — нативная работа с JSON без String serialization
- RediSearch — полнотекстовый поиск без Elasticsearch для простых случаев
На собеседовании: интервьюер проверяет, знаете ли вы, какую структуру данных выбрать под задачу. Частая ошибка — использовать только String для всего, не зная про Hash для объектов и Sorted Set для рейтингов.