65 lines
6.2 KiB
Markdown
65 lines
6.2 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
tags:
|
|||
|
- maturity/🌱
|
|||
|
date:
|
|||
|
- - 2024-05-23
|
|||
|
zero-link:
|
|||
|
- "[[00 Разработка]]"
|
|||
|
linked:
|
|||
|
- "[[Memcached]]"
|
|||
|
---
|
|||
|
Remote Dictionary Service (Redis) — это хранилище данных на основе [[../../../../knowledge/dev/pc/Оперативная память|оперативной памяти]] (RAM) организованное по принципу "ключ-значение". Работает с использованием [кооперативной многозадачности](../../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). Но при этом может страдать надежность доставки.
|