Redis: структуры данных и команды

↑ 4.1 Redis и MongoDB · → Следующая

Желательно~3 мин чтенияУровень: middle

Зачем это на собесе

Redis — не «просто кэш»: спрашивают структуры данных и то, какую задачу решает каждая.

Что такое Redis

Хранилище «ключ–значение» в оперативной памяти с богатыми структурами данных. Однопоточное выполнение команд (ввод-вывод в новых версиях многопоточный): операции атомарны, задержки — доли миллисекунды. Порт 6379, протокол RESP.

Структуры данных

ТипКомандыПрименение
StringSET, GET, INCR, SETEX, SETNX, MGETкэш, счётчики, токены, блокировки
HashHSET, HGET, HGETALL, HINCRBYобъекты (профиль, сессия)
ListLPUSH, RPOP, BLPOP, LRANGEочереди, последние N событий
SetSADD, SISMEMBER, SINTER, SUNIONтеги, уникальные значения, «кто онлайн»
Sorted SetZADD, ZRANGE, ZRANGEBYSCORE, ZINCRBY, ZRANKрейтинги, приоритетные очереди, задержанные задачи
StreamXADD, XREADGROUP, XACKжурнал событий, очереди
BitmapSETBIT, BITCOUNTфлаги активности
HyperLogLogPFADD, PFCOUNTприближённые уникальные (0.81% ошибки, 12 КБ)
GeoGEOADD, GEOSEARCHпоиск рядом
JSON, Search, TimeSeries, Bloomмодули Redis Stackдокументы, поиск, временные ряды

Примеры

SET user:42:name "Анна" EX 3600          # со сроком жизни
INCR page:home:views                     # атомарный счётчик
HSET user:42 name "Анна" city "Москва" plan "pro"
HGETALL user:42
LPUSH queue:emails "job1"; BRPOP queue:emails 5
SADD online:2026-09-30 42 43; SCARD online:2026-09-30
ZADD leaderboard 1500 "anna" 1320 "boris"
ZREVRANGE leaderboard 0 9 WITHSCORES     # топ-10
PFADD visitors:2026-09-30 "u1" "u2"; PFCOUNT visitors:2026-09-30

Ключи

  • имена с префиксами: app:entity:id:field (shop:cart:42);
  • не используйте KEYS * на проде (блокирует): применяйте SCAN с курсором;
  • срок жизни: EXPIRE key sec, TTL key, PERSIST;
  • удаление больших ключей: UNLINK (асинхронно) вместо DEL.

Транзакции и скрипты

  • MULTI / EXEC: пакет команд выполняется последовательно без вмешательства (без отката при ошибке команды); WATCH для оптимистичной блокировки;
  • Lua-скрипты (EVAL) и Functions: атомарное выполнение произвольной логики на сервере;
  • pipelining: отправка нескольких команд без ожидания ответов (меньше задержек сети).

Сложность и большие структуры

Команды имеют сложность O(1), O(log n), O(n): следите за O(n) на больших коллекциях (HGETALL на огромном хэше, SMEMBERS, LRANGE 0 -1). Большие ключи (big keys) блокируют сервер и создают перекосы.

Использование из .NET

StackExchange.Redis: ConnectionMultiplexer (один на приложение), IDatabase, асинхронные методы, IServer.Keys (SCAN), ISubscriber.

var mux = await ConnectionMultiplexer.ConnectAsync("redis:6379");
var db = mux.GetDatabase();
await db.StringSetAsync("user:42:name", "Анна", TimeSpan.FromHours(1));
var name = await db.StringGetAsync("user:42:name");
await db.HashSetAsync("user:42", [new("name", "Анна"), new("plan", "pro")]);
long views = await db.StringIncrementAsync("page:home:views");

Вопросы с ответами