Redis: структуры данных и команды
↑ 4.1 Redis и MongoDB · → Следующая
Зачем это на собесе
Redis — не «просто кэш»: спрашивают структуры данных и то, какую задачу решает каждая.
Что такое Redis
Хранилище «ключ–значение» в оперативной памяти с богатыми структурами данных. Однопоточное выполнение команд (ввод-вывод в новых версиях многопоточный): операции атомарны, задержки — доли миллисекунды. Порт 6379, протокол RESP.
Структуры данных
| Тип | Команды | Применение |
|---|---|---|
| String | SET, GET, INCR, SETEX, SETNX, MGET | кэш, счётчики, токены, блокировки |
| Hash | HSET, HGET, HGETALL, HINCRBY | объекты (профиль, сессия) |
| List | LPUSH, RPOP, BLPOP, LRANGE | очереди, последние N событий |
| Set | SADD, SISMEMBER, SINTER, SUNION | теги, уникальные значения, «кто онлайн» |
| Sorted Set | ZADD, ZRANGE, ZRANGEBYSCORE, ZINCRBY, ZRANK | рейтинги, приоритетные очереди, задержанные задачи |
| Stream | XADD, XREADGROUP, XACK | журнал событий, очереди |
| Bitmap | SETBIT, BITCOUNT | флаги активности |
| HyperLogLog | PFADD, PFCOUNT | приближённые уникальные (0.81% ошибки, 12 КБ) |
| Geo | GEOADD, 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");Вопросы с ответами
Почему Redis быстрый?
Данные в памяти, простые структуры, эффективная однопоточная модель без блокировок между потоками, мультиплексирование соединений (epoll), pipelining.
Чем плох KEYS *?
Это O(N) и блокирует единственный поток обработки команд; на больших базах вызывает простои. Используйте
SCAN.
Какую структуру выбрать для рейтинга?
Sorted Set:
ZADD/ZINCRBYдля обновления,ZREVRANGEдля топа,ZRANKдля места пользователя, все за O(log n).