Учебник Redis для начинающих
Redis — это сверхбыстрое хранилище данных в оперативной памяти, ставшее стандартом для кэширования, очередей и работы со структурами данных в реальном времени. Этот курс проведёт вас от основ in-memory хранилищ до продакшен-эксплуатации.
Вы освоите кэш-паттерны (cache-aside, write-through, защита от cache stampede), все базовые структуры данных и их внутреннее устройство, Pub/Sub и надёжные очереди на Streams, персистентность (RDB/AOF), распределённые блокировки и масштабирование. Запускаемые Python-врезки покажут, как структуры Redis устроены изнутри.
Курс «Redis: кэш и структуры в памяти» состоит из 10 разделов и 37 уроков: Что такое Redis и in-memory хранилища, Строки и базовые команды, Структуры данных Redis, Кэширование и TTL, Pub/Sub и очереди сообщений, Персистентность и продакшен, Продвинутые структуры: Bitmaps, HyperLogLog, Geo, Streams, Транзакции, скрипты и производительность, Паттерны Redis: блокировки, лимиты, рейтинги и Масштабирование и внутреннее устройство. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Что такое Redis и in-memory хранилища
- Что такое Redis и зачем нужна память
Redis — это in-memory хранилище данных: что это значит, почему оно в сотни раз быстрее диска и где применяется на практике.
- Установка Redis и первое подключение
Как установить Redis локально через Docker и пакетный менеджер, подключиться через redis-cli и выполнить первые команды.
- Ключи, пространства имён и время жизни
Как устроены ключи в Redis, зачем нужны двоеточия в именах, как работают EXPIRE и TTL и что такое истечение ключей.
- Что такое Redis и зачем нужна память
2 Строки и базовые команды
- Строки: основной тип данных Redis
Строки в Redis — это не только текст: числа, бинарные данные, JSON. Команды SET, GET, APPEND, GETSET и работа со строками.
- Числа, счётчики и атомарный инкремент
Команды INCR, DECR, INCRBY и атомарные счётчики Redis: как считать просмотры, лайки и события без гонок данных.
- Транзакции и пайплайнинг
MULTI/EXEC для группировки команд, WATCH для оптимистичных блокировок и пайплайнинг для снижения сетевых задержек.
- Строки: основной тип данных Redis
3 Структуры данных Redis
- Списки: очереди и стеки
Списки Redis (LPUSH, RPUSH, LPOP, RPOP, LRANGE): двусторонние очереди, стеки, ленты и блокирующие операции.
- Множества: уникальность и пересечения
Множества Redis (SADD, SISMEMBER, SINTER, SUNION): хранение уникальных значений, теги, общие друзья и операции над множествами.
- Хеши: объекты и поля
Хеши Redis (HSET, HGET, HGETALL, HINCRBY): хранение объектов с полями, профилей пользователей и экономия памяти.
- Sorted Sets: рейтинги и лидерборды
Отсортированные множества Redis (ZADD, ZRANGE, ZRANK, ZSCORE): лидерборды, рейтинги, очереди с приоритетом и диапазонные запросы.
- Списки: очереди и стеки
4 Кэширование и TTL
- Паттерн cache-aside
Cache-aside (ленивое кэширование): как приложение кэширует данные из БД, схема работы, обработка промахов и попаданий.
- Стратегии записи: write-through и write-behind
Стратегии записи в кэш: write-through (запись насквозь), write-behind (отложенная запись) и их компромиссы согласованности и скорости.
- TTL, политики вытеснения и maxmemory
Управление памятью Redis: maxmemory, политики вытеснения allkeys-lru, volatile-ttl, LRU/LFU и стратегия выбора TTL.
- Защита кэша: стампед, лавина, проникновение
Проблемы кэша под нагрузкой: cache stampede (thundering herd), cache penetration и cache avalanche, и как их предотвратить.
- Паттерн cache-aside
5 Pub/Sub и очереди сообщений
- Pub/Sub: рассылка событий в реальном времени
Механизм Pub/Sub в Redis (PUBLISH, SUBSCRIBE, PSUBSCRIBE): рассылка сообщений подписчикам, каналы и паттерны.
- Очереди задач на списках
Простые очереди задач на списках Redis: продюсеры и воркеры, RPUSH/BLPOP, надёжная очередь и обработка падений воркера.
- Redis Streams: надёжные очереди событий
Redis Streams (XADD, XREAD, XREADGROUP, consumer groups): надёжные журналы событий с хранением, подтверждениями и группами потребителей.
- Pub/Sub: рассылка событий в реальном времени
6 Персистентность и продакшен
- Персистентность: RDB и AOF
Сохранение данных Redis на диск: RDB-снапшоты, AOF-журнал команд, appendfsync everysec и гибридный режим для продакшена.
- Распределённые блокировки и атомарность через Lua
Распределённые блокировки на Redis (SET NX EX), безопасное снятие и Lua-скрипты для атомарной логики read-modify-write.
- Продвинутые структуры: HyperLogLog, Bitmaps, Streams Stack
Специальные структуры Redis: HyperLogLog для подсчёта уникальных, Bitmaps для флагов, и обзор модулей Redis Stack (JSON, Search, Bloom).
- Redis в продакшене: масштабирование и эксплуатация
Redis в продакшене: репликация, Sentinel, Cluster, мониторинг через INFO, безопасность и чек-лист готовности к нагрузке.
- Персистентность: RDB и AOF
7 Продвинутые структуры: Bitmaps, HyperLogLog, Geo, Streams
- Bitmaps: биты как данные
Bitmaps в Redis: SETBIT, GETBIT, BITCOUNT, BITOP; аналитика присутствия (был ли пользователь сегодня) и экономия памяти — миллион флагов в 122 КБ.
- HyperLogLog: подсчёт уникальных приближённо
HyperLogLog в Redis: PFADD, PFCOUNT, PFMERGE; приближённый подсчёт уникальных с погрешностью ~0.81% при постоянных ~12 КБ памяти и как устроен алгоритм.
- Гео-команды: координаты и радиус
Гео-команды Redis: GEOADD, GEOSEARCH, GEODIST; поиск объектов рядом по радиусу, как это устроено на sorted set через geohash, на примере поиска ближайших кафе.
- Streams вглубь: consumer groups
Streams в Redis вглубь: XADD, XREAD, XGROUP, XACK; consumer groups и PEL для надёжных очередей с подтверждением и отличие Streams от Pub/Sub и списков.
- Bitmaps: биты как данные
8 Транзакции, скрипты и производительность
- Транзакции: MULTI, EXEC, WATCH
Транзакции Redis: пачка команд через MULTI/EXEC, оптимистичная блокировка WATCH и ключевое отличие от SQL — в Redis нет отката упавших команд.
- Lua-скрипты: атомарность и логика на сервере
Lua-скрипты в Redis: EVAL и EVALSHA, почему скрипт атомарен, передача данных через KEYS и ARGV и когда скрипт лучше нескольких отдельных команд.
- Конвейеризация: убираем задержки сети
Конвейеризация в Redis: что такое RTT, как pipelining отправляет команды пачкой без ожидания ответа, кратный выигрыш и чем это отличается от транзакций.
- Pub/Sub против Streams: что выбрать
Pub/Sub против Streams в Redis: fire-and-forget без истории против надёжного журнала с переигрыванием, группами потребителей и подтверждениями — когда какой механизм.
- Транзакции: MULTI, EXEC, WATCH
9 Паттерны Redis: блокировки, лимиты, рейтинги
- Распределённые блокировки
Распределённая блокировка на Redis: SET NX EX как простой лок, зачем уникальный токен, снятие через Lua, проблемы одиночного лока, Redlock и когда лок реально нужен.
- Ограничение частоты (rate limiting)
Rate limiting на Redis: счётчик с TTL для фиксированного окна, скользящее окно по логу меток и token bucket. Python-иллюстрации алгоритмов и сравнение их свойств.
- Рейтинги и таблицы лидеров на sorted sets
Таблицы лидеров на Redis sorted sets: ZADD для очков, ZREVRANGE для топа, ZREVRANK для ранга игрока, выборка по диапазону очков и рейтинг в реальном времени.
- Сессии и кэш-паттерны
Сессии и кэш в Redis: хранение сессий с TTL и скользящим окном, паттерны cache-aside и write-through, инвалидация и защита от cache stampede блокировкой и джиттером.
- Распределённые блокировки
10 Масштабирование и внутреннее устройство
- Репликация и Sentinel: высокая доступность
Репликация Redis: роли primary и replica, асинхронная репликация, REPLICAOF. Sentinel следит за мастером, проводит автоматический failover и сообщает клиенту адрес нового мастера.
- Redis Cluster: шардирование
Redis Cluster: 16384 хэш-слота, распределение ключей по узлам через CRC16, перенаправление MOVED/ASK, hash tags для совместного размещения ключей и ограничения мультиключевых операций.
- Память и политики вытеснения
Управление памятью Redis: maxmemory и политики вытеснения noeviction, allkeys-lru, volatile-ttl, allkeys-lfu и другие. Как Redis выбирает что удалить, с иллюстрацией LRU на Python.
- Безопасность и мониторинг
Защита и наблюдаемость Redis: ACL и пользователи, ограничение опасных команд через rename-command, мониторинг через INFO, SLOWLOG и LATENCY, бенчмарк redis-benchmark и типичные узкие места.
- Репликация и Sentinel: высокая доступность