Redis (Remote Dictionary Service) — это хранилище данных на основе оперативной памяти, построенное на архитектуре “ключ-значение”. Оно отличается высокой производительностью благодаря использованию IO multiplexing и однопоточному event loop, что позволяет эффективно обрабатывать запросы. Основная область применения Redis — это системы с требованиями к минимальной задержке и высокой скорости обработки данных.
Redis использует однопоточную модель выполнения с использованием multiplexing для работы с запросами, что обеспечивает простоту реализации и высокую производительность.
Особенности:
- Большое количество команд
- Можно запускать код на Lua. Но в урезаном режиме.
- Имеет сложные типы данны: списки, хеш-мапы
- Есть режимы подписки pub/sub.
- Однопоточный
- Написан на C
- Есть персистентный режим
- Кластеризуется
- Можно включить аутентификацию
- Есть транзакции
**Преимущества
- Высокая скорость доступа к данным благодаря оперативной памяти.
- Поддержка сложных структур данных.
- Простота интеграции и использования через CLI и клиентские библиотеки.
Недостатки:
- Сложность настройки и управления кластером.
- Ограниченная надёжность в режиме pub/sub по сравнению с другими системами (например, RabbitMQ).
- Использование оперативной памяти ограничивает объём хранимых данных.
Redis может использоваться в различных сценариях:
- Кэширование: ускорение обработки данных с частым доступом.
- Управление сессиями: хранение данных сессий пользователей.
- Распределённая блокировка: установка блокировок между сервисами.
- Очереди сообщений: управление сообщениями с использованием структур данных (списки, потоки).
- Подсчёт данных: подсчёт просмотров, лайков.
- Ограничитель частоты запросов: Redis позволяет устанавливать лимиты на частоту запросов для определённых IP-адресов пользователей.
- Рейтинги и сортировки: с помощью сортированных множеств (ZSet).
- Генератор глобальных ID: Можно использовать Redis для генерации глобальных идентификаторов с помощью целочисленных значений.
- Доступ к данным в RAM как минимум в 1000 раз быстрее, чем произвольный доступ к данным на диске.
- Redis использует IO multiplexing и single-threaded execution loop для повышения эффективности работы.
- Кроме того, Redis задействует несколько эффективных низкоуровневых структур данных.
Redis поддерживает два типа сохранения данных.
- RDB создание снимков базы данных через заданные промежутки времени
- AOF логирование каждой операции для минимизации потерь данных
Комбинированный подход RDB + AOF позволяет добиться как высокой производительности, так и надёжности. В случае катастрофы Redis сначала восстанавливает данные из последнего RDB-снапшота, а затем воспроизводит команды из AOF, чтобы восстановить данные до актуального состояния.
Кластеризация
Реплики работают только в режиме чтения. Нужно на стороне клиента понять в какую реплику нужно писать ключ. При отправке запроса не в ту реплику, редис ответит ошибкой, указав хост, куда нужно отправить запрос.
Что если упадет один из мастеров? В таком случае кластер не обнаружит проблему и нас будут отправлять на несуществующий адрес.
Есть senitel. Который выступает оркестратором и прокси. Он сам будет отправлять запросы в нужную ноду. Он же будет отвечать за Failover?
Заметки
- Порт по умолчанию 6379
- Может работать с геолокациями