Основы key-value хранилища, персистентности и репликации
Ответ: Redis (Remote Dictionary Server) — это хранилище данных в памяти (in-memory), которое работает по модели ключ-значение (key-value). Благодаря тому, что данные хранятся в оперативной памяти, а не на диске, Redis обеспечивает крайне низкую задержку операций чтения и записи.
Ответ: Redis и реляционные СУБД (MySQL, PostgreSQL) решают разные задачи и обычно используются вместе, а не вместо друг друга.
| Критерий | Реляционная СУБД | Redis |
|---|---|---|
| Место хранения данных | Диск (с кэшированием в памяти) | Оперативная память (с опциональной записью на диск) |
| Модель данных | Таблицы, строки, внешние ключи | Ключ-значение, простые структуры данных |
| Скорость | Ниже из-за обращений к диску | Очень высокая |
| Запросы | Сложные запросы (JOIN, агрегации) через SQL | Простые операции по ключу, без JOIN |
| Типичная роль | Основное хранилище данных | Кэш, сессии, очереди поверх основной базы данных |
Ответ: Redis — это не просто хранилище строк, он поддерживает несколько встроенных структур данных, каждая со своим набором команд.
SET key value)LPUSH, RPUSH, LRANGE)HSET, HGET, HGETALL)SADD, SMEMBERS, SINTER)ZADD, ZRANGE) — удобен для рейтинговОтвет: Хотя Redis хранит данные в памяти, он поддерживает два механизма сохранения данных на диск, чтобы не потерять их при перезапуске.
| Критерий | RDB (снапшоты) | AOF (журнал операций) |
|---|---|---|
| Принцип работы | Периодически сохраняет полный снимок данных в файл | Записывает каждую операцию изменения данных в лог-файл |
| Риск потери данных | Можно потерять данные за период между снапшотами | Минимальный, вплоть до каждой операции (в зависимости от настройки fsync) |
| Размер файла | Компактный | Обычно больше, растёт со временем |
| Скорость восстановления | Быстрее (загрузка снапшота) | Медленнее (повторное применение всех операций) |
| Производительность записи | Меньше нагрузка на диск | Больше нагрузка на диск |
Ответ: TTL (Time To Live) — это время жизни ключа, после которого Redis автоматически удаляет его. Это ключевой механизм для реализации кэша, чтобы данные не хранились бесконечно.
SET session:123 "userdata"
EXPIRE session:123 3600 // ключ удалится через 3600 секунд
TTL session:123 // вернёт оставшееся время жизни в секундах
PERSIST session:123 // убирает TTL, ключ больше не истечёт
SET session:123 "userdata" EX 3600 // задать значение с TTL сразу
DEL или не будет вытеснен политикой eviction при нехватке памяти.
Ответ: Ниже приведены самые часто используемые команды для двух базовых типов данных.
SET user:1:name "Alice"
GET user:1:name
INCR page:views // атомарно увеличивает числовое значение на 1
INCRBY page:views 10
SETNX lock:order:5 "locked" // установить значение, только если ключа ещё нет
HSET user:1 name "Alice" age "30"
HGET user:1 name
HGETALL user:1
HDEL user:1 age
Ответ: Pub/Sub (publish/subscribe) — это механизм обмена сообщениями, при котором отправители (publishers) публикуют сообщения в именованные каналы, а получатели (subscribers) подписываются на нужные каналы и получают сообщения в реальном времени.
// Подписчик
SUBSCRIBE notifications
// Издатель (из другого клиента)
PUBLISH notifications "Новый заказ #123"
Ответ: Cache-aside (он же lazy loading) — самый распространённый паттерн кэширования: приложение само управляет тем, когда читать из кэша, а когда обращаться к основной базе данных.
Ответ: Репликация Redis построена по схеме master-replica: один узел (master) принимает все операции записи, а один или несколько узлов-реплик (replica) асинхронно копируют данные с master и могут обслуживать запросы на чтение.
Ответ: Redis Sentinel — это система мониторинга и автоматического failover для конфигурации master-replica. Она следит за состоянием узлов и обеспечивает высокую доступность (high availability) без ручного вмешательства.
Ответ: Redis Cluster — это встроенное решение для горизонтального масштабирования, которое распределяет (шардирует) данные между несколькими узлами, каждый из которых хранит только часть всего набора данных.
Ответ: Redis отлично подходит для одних задач и плохо — для других, поскольку оптимизирован под скорость доступа к данным в памяти, а не под сложные запросы или гарантированную долговременную сохранность.