--- aliases: - Redis tags: - maturity/🌱 date: - - 2024-05-23 zero-link: - "[[../../dev/Key-Value хранилище|Key-Value хранилище]]" linked: - "[[Memcached]]" --- Redis (Remote Dictionary Service) — это хранилище данных на основе [[../../../../knowledge/dev/pc/Оперативная память|оперативной памяти]], построенное на архитектуре "[[../../dev/Key-Value хранилище|ключ-значение]]". Оно отличается высокой производительностью благодаря использованию IO multiplexing и однопоточному [[../../dev/architecture/Event Loop|event loop]], что позволяет эффективно обрабатывать запросы. Основная область применения Redis — это системы с требованиями к минимальной задержке и высокой скорости обработки данных. Redis использует однопоточную модель выполнения с использованием multiplexing для работы с запросами, что обеспечивает простоту реализации и высокую производительность. - [[../../dev/system-design/Конфигурация Redis|Конфигурация Redis]] - [[../../dev/system-design/Команды Redis-cli|Команды Redis-cli]] Особенности: - Большое количество команд - Можно запускать код на Lua. Но в урезаном режиме. - Имеет сложные типы данны: списки, хеш-мапы - Есть режимы подписки pub/sub. - Однопоточный - Написан на C - Есть персистентный режим - Кластеризуется - Можно включить аутентификацию - Есть транзакции **Преимущества - Высокая скорость доступа к данным благодаря оперативной памяти. - Поддержка сложных структур данных. - Простота интеграции и использования через CLI и клиентские библиотеки. **Недостатки:** - Сложность настройки и управления кластером. - Ограниченная надёжность в режиме pub/sub по сравнению с другими системами (например, RabbitMQ). - Использование оперативной памяти ограничивает объём хранимых данных. Redis может использоваться в различных сценариях: - [[../../dev/architecture/Кэширование|Кэширование]]: ускорение обработки данных с частым доступом. - **Управление сессиями**: хранение данных сессий пользователей. - Распределённая [[../../dev/fundamental/Блокировка|блокировка]]: установка блокировок между сервисами. - **Очереди сообщений**: управление сообщениями с использованием структур данных (списки, потоки). - **Подсчёт данных**: подсчёт просмотров, лайков. - **Ограничитель частоты запросов**: Redis позволяет устанавливать лимиты на частоту запросов для определённых IP-адресов пользователей. - **Рейтинги и сортировки**: с помощью сортированных множеств (ZSet). - **Генератор глобальных ID**: Можно использовать Redis для генерации глобальных идентификаторов с помощью целочисленных значений. ![[../files/images/Pasted image 20241103034136.png]] - Доступ к данным в RAM как минимум в 1000 раз быстрее, чем произвольный доступ к данным на диске. - Redis использует IO multiplexing и [[../../dev/architecture/Event Loop|single-threaded execution loop]] для повышения эффективности работы. - Кроме того, Redis задействует несколько эффективных низкоуровневых структур данных. Redis поддерживает два типа сохранения данных. - [[../../dev/system-design/Redis Database Backup|RDB]] создание снимков базы данных через заданные промежутки времени - [[../../dev/system-design/Append-Only File|AOF]] логирование каждой операции для минимизации потерь данных Комбинированный подход RDB + AOF позволяет добиться как высокой производительности, так и надёжности. В случае катастрофы Redis сначала восстанавливает данные из последнего RDB-снапшота, а затем воспроизводит команды из AOF, чтобы восстановить данные до актуального состояния. ## Кластеризация Реплики работают только в режиме чтения. Нужно на стороне клиента понять в какую реплику нужно писать ключ. При отправке запроса не в ту реплику, редис ответит ошибкой, указав хост, куда нужно отправить запрос. Что если упадет один из мастеров? В таком случае кластер не обнаружит проблему и нас будут отправлять на несуществующий адрес. Есть senitel. Который выступает оркестратором и прокси. Он сам будет отправлять запросы в нужную ноду. Он же будет отвечать за Failover? ## Заметки - Порт по умолчанию 6379 - Может работать с геолокациями