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