Gymterview
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 для рейтингов.