digital-garden/meta/zero/00 Redis.md
Struchkov Mark 6d903d4988
Some checks failed
continuous-integration/drone/push Build is failing
Обновление
2024-11-24 20:43:38 +03:00

70 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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
- Может работать с геолокациями