digital-garden/meta/zero/00 Redis.md
Struchkov Mark c8bcf584e1
All checks were successful
continuous-integration/drone/push Build is passing
Тип хранилища данных
2024-11-24 10:17:46 +03:00

65 lines
6.3 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:
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). Но при этом может страдать надежность доставки.