52
dev/Code Review.md
Normal file
@ -0,0 +1,52 @@
|
||||
---
|
||||
aliases:
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-11-03
|
||||
---
|
||||
![[../../../meta/files/Pasted image 20241103220651.png]]
|
||||
|
||||
- **Code Style (Стиль кода)**:
|
||||
- Применен ли стиль форматирования проекта?
|
||||
- Достаточно ли [[Читаемый код|читаем код]] (длина методов и т.п.)?
|
||||
- Соблюдается ли принцип DRY (Don't Repeat Yourself)?
|
||||
- Соответствует ли именование общепринятым соглашениям?
|
||||
- **Tests (Тесты)**:
|
||||
- Проходят ли все тесты?
|
||||
- Новые функции протестированы?
|
||||
- Покрыты ли крайние случаи?
|
||||
- Используются ли юнит-тесты и интеграционные тесты?
|
||||
- Есть ли тесты для нефункциональных требований, например, производительность?
|
||||
- **Documentation (Документация)**:
|
||||
- Есть ли документация для новых функций?
|
||||
- Покрыты ли различные виды документации: README, API, user guide и др.?
|
||||
- Понятны ли документы, нет ли ошибок в типографике и грамматике?
|
||||
- **Implementation Semantics (Семантика реализации)**:
|
||||
- Соответствует ли реализация исходным требованиям?
|
||||
- Корректна ли логика?
|
||||
- Нет ли излишней сложности?
|
||||
- Надежна ли реализация (вопросы конкурентности, обработки ошибок и т.д.)?
|
||||
- Хорошая ли производительность?
|
||||
- Безопасна ли (например, отсутствие SQL-инъекций)?
|
||||
- Можно ли наблюдать за реализацией (метрики, логирование и т.д.)?
|
||||
- Тянут ли новые зависимости свой вес, приемлема ли их лицензия?
|
||||
- **API Semantics (Семантика API)**:
|
||||
- Насколько компактно API, оно достаточно большое или наоборот?
|
||||
- Есть ли один способ достижения цели, без множественных подходов?
|
||||
- API предсказуемо, следует ли оно принципу наименьшего удивления?
|
||||
- Являются ли внутренности API скрытыми от пользователя?
|
||||
- Нет ли изменений, ломающих обратную совместимость?
|
||||
- Насколько полезно и не слишком специфично API?
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../meta/zero/00 Разработка|00 Разработка]]
|
||||
**Родитель**::
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-11-03]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
||||
|
||||
### Дочерние заметки
|
||||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||||
|
@ -19,11 +19,11 @@ public List<User> getUsersByType(String userType, Set<Long> userIds)
|
||||
- При изменении параметров, ключ кэширования также должен изменяться. В данном случае, если изменятся значения аргументов `userType` и `userIds`, мы должны получить новое значение ключа.
|
||||
- По параметрам ключ должен определяться однозначно, то есть для одних и тех же значений аргументов ключ кэширования должен принимать только одно значение. Иначе мы рискуем понизить эффективность процесса кэширования, создавая несколько кэшей для одной и той же выборки.
|
||||
|
||||
Сформируем ключ кэширования для нашего метода. В качестве хранилища будем использовать [[../../../../../wiki/zero/00 Redis]].
|
||||
Сформируем ключ кэширования для нашего метода. В качестве хранилища будем использовать [[../../../meta/zero/00 Redis]].
|
||||
|
||||
В начале ключа я обычно обязательно указываю какой-то уникальный префикс сервиса, чтобы не получить коллизию между разными сервисами. Пускай в данном случае префикс будет `USER_SERVICE`. Также добавляю уникальный префикс метода, в данном случае будет `USERS`.
|
||||
|
||||
В качестве разделителей рекомендую использовать `:`, в [[../../../../../wiki/zero/00 Redis|00 Redis]] это позволяет визуально сгруппировать ключи. Это позволяет визуально группировать ключи при использовании UI клиента. Таким образом начало нашего ключа выглядит следующим образом: `USER_SERVICE:USERS:`.
|
||||
В качестве разделителей рекомендую использовать `:`, в [[../../../meta/zero/00 Redis|00 Redis]] это позволяет визуально сгруппировать ключи. Это позволяет визуально группировать ключи при использовании UI клиента. Таким образом начало нашего ключа выглядит следующим образом: `USER_SERVICE:USERS:`.
|
||||
|
||||
Значения аргументов метода также должны попасть в ключ. Возьмем наш первый аргумент `String userType`. Для аргумента также можно использовать префиксы, но это не обязательно. В данном случае пусть будет `USER_TYPE`. А вот для самого значения параметра есть несколько вариантов:
|
||||
- Оставить строкой и просто выполнить конкатенацию.
|
||||
|
@ -15,7 +15,7 @@ parents:
|
||||
- Внутри сервиса. Хранение в ОЗУ
|
||||
- За сервисом
|
||||
- [Memcached](Memcached.md)
|
||||
- [[../../../../wiki/zero/00 Redis|Redis]]
|
||||
- [[../../meta/zero/00 Redis|Redis]]
|
||||
|
||||
![](../../meta/files/images/Pasted%20image%2020240617184722.png)
|
||||
|
||||
|
@ -3,11 +3,9 @@ aliases:
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-09-17
|
||||
zero-link:
|
||||
- "[[../../../meta/zero/00 Разработка|00 Разработка]]"
|
||||
parents:
|
||||
linked:
|
||||
---
|
||||
![[../../../meta/files/images/Pasted image 20241103220925.png]]
|
||||
|
||||
![[../../../meta/files/images/Pasted image 20241103022447.png]]
|
||||
|
||||
- [[Tree|Дерево]]
|
||||
|
@ -21,6 +21,8 @@ parents:
|
||||
Процесс содержит в себе [потоки](Поток%20процесса%20ОС.md).
|
||||
|
||||
Под любой процесс создаются свои [Namespace](../linux/Namespace.md), которые позволяют изолировать процессы, запущенные на одном ядре друг от друга.
|
||||
|
||||
![[../../meta/files/images/Pasted image 20241103221422.png]]
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Архитектура ЭВМ|00 Архитектура ЭВМ]]]
|
||||
|
@ -5,7 +5,7 @@ tags:
|
||||
- content/opinion
|
||||
date: 2024-10-20
|
||||
---
|
||||
Использование `var`, введенное в [[../../../knowledge/dev/java/Java 10|Java 10]], может улучшить компактность кода, но имеет недостатки, связанные со снижением [[Читаемый код|читаемости]]. Хотя переменная остается статически типизированной и обеспечивает безопасность кода, ==скрытие типа может затруднить понимание логики, особенно при командной работе и ревью.==
|
||||
Использование `var`, введенное в [[../../../../knowledge/dev/java/Java 10|Java 10]], может улучшить компактность кода, но имеет недостатки, связанные со снижением [[Читаемый код|читаемости]]. Хотя переменная остается статически типизированной и обеспечивает безопасность кода, ==скрытие типа может затруднить понимание логики, особенно при командной работе и ревью.==
|
||||
|
||||
Например, следующий код не дает информации о том, что представляет `result` и что возвращает метод `process()`, что усложняет чтение, особенно в больших командах:
|
||||
|
||||
@ -16,7 +16,7 @@ var result = process();
|
||||
Это может привести к путанице, особенно если метод возвращает обобщённый тип или коллекцию. Без явного указания типов ==разработчикам придётся тратить дополнительное время на выяснение, что происходит==.
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../meta/zero/00 Java разработка|00 Java разработка]]
|
||||
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
|
||||
**Родитель**::
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-10-20]]
|
44
dev/system-design/Append-Only File.md
Normal file
@ -0,0 +1,44 @@
|
||||
---
|
||||
aliases:
|
||||
- AOF
|
||||
- appendonly
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-10-07
|
||||
zero-link:
|
||||
parents:
|
||||
linked:
|
||||
---
|
||||
Включение режима appendonly позволяет Redis обеспечивать долговременное хранение данных, записывая каждую операцию изменения в файл в хронологическом порядке. Вот основные моменты, которые стоит знать.
|
||||
|
||||
![[../../meta/files/images/Pasted image 20241103222301.png]]
|
||||
|
||||
**Как работает AOF:**
|
||||
- **Лог изменений**: Когда appendonly включен, Redis записывает каждую команду, изменяющую состояние базы данных (например, SET, DEL, LPUSH), в файл AOF, а не только хранит данные в памяти.
|
||||
- **Постоянное сохранение данных**: Эти команды добавляются в конец файла (append), что позволяет восстанавливать состояние базы данных, выполняя все записанные команды по порядку, если Redis перезапускается.
|
||||
- **Конфигурация сохранения**: В файле конфигурации Redis (redis.conf) можно указать несколько режимов, как часто Redis должен сбрасывать данные в файл:
|
||||
- appendfsync always — данные сбрасываются на диск после каждой команды (максимальная надежность, но высокая нагрузка на диск).
|
||||
- appendfsync everysec — данные сбрасываются раз в секунду (оптимальный компромисс между производительностью и надежностью).
|
||||
- appendfsync no — система операционной системы сама решает, когда записывать данные на диск (максимальная производительность, но может привести к потере данных при сбое).
|
||||
|
||||
**Преимущества AOF:**
|
||||
- **Надежность**: AOF предлагает более надежное сохранение данных, чем механизм RDB (Redis Database Backup), который делает дампы данных на определенные промежутки времени.
|
||||
- **Гибкость восстановления**: В случае сбоя Redis можно восстановить состояние базы данных, воспроизведя команды из AOF, что минимизирует потерю данных.
|
||||
- **Читаемость файла**: AOF-файл — это текстовый файл, который легко можно прочитать и проанализировать для восстановления операций вручную, если потребуется.
|
||||
|
||||
**Потенциальные недостатки:**
|
||||
- **Рост размера файла**: Со временем файл AOF может значительно вырасти, так как в нем сохраняются все операции. Чтобы решить эту проблему, Redis периодически выполняет операцию “переписывания” AOF-файла — это процесс, при котором он сжимает файл, удаляя избыточные команды и сохраняя только текущую версию данных.
|
||||
- **Производительность**: В зависимости от настроек, частота записи в AOF может влиять на производительность системы (особенно при использовании режима appendfsync always).
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Redis|00 Redis]]
|
||||
**Родитель**::
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-10-07]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
- [[Redis Database Backup]]
|
||||
|
||||
### Дочерние заметки
|
||||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||||
|
36
dev/system-design/Redis Database Backup.md
Normal file
@ -0,0 +1,36 @@
|
||||
---
|
||||
aliases:
|
||||
- RDB
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-10-07
|
||||
---
|
||||
Механизм RDB (Redis Database Backup) — это способ создания **снапшотов** состояния базы данных Redis и их сохранения на диск. В отличие от [[Append-Only File|AOF]], который записывает каждую операцию в реальном времени, RDB создаёт полные резервные копии состояния базы на определенные промежутки времени. Вот как это работает и основные моменты, которые стоит учитывать:
|
||||
|
||||
![[../../meta/files/images/Pasted image 20241103222301.png]]
|
||||
|
||||
**Как работает RDB:**
|
||||
- **Снапшоты базы данных**: Redis периодически сохраняет полную копию всех данных в файл на диске. Это называется “снапшот”. RDB-файл содержит сжатую и двоичную версию всех ключей и их значений на момент создания.
|
||||
- **Файл дампа**: По умолчанию, RDB-файл называется `dump.rdb` и сохраняется на диск. Этот файл можно использовать для восстановления данных при перезапуске Redis.
|
||||
|
||||
**Преимущества RDB:**
|
||||
- **Производительность**: В отличие от AOF, механизм RDB не влияет на производительность во время нормальной работы Redis. Он не записывает каждую операцию на диск, а вместо этого периодически делает полные снимки базы данных.
|
||||
- **Меньший объем данных**: Файл RDB, как правило, компактный и занимает меньше места, чем файл AOF, так как он представляет собой сжатую копию текущего состояния базы, а не лог изменений.
|
||||
- **Быстрое восстановление**: При перезапуске Redis восстановление данных из RDB быстрее, чем воспроизведение всех операций из AOF, так как это просто загрузка состояния базы на момент последнего снапшота.
|
||||
|
||||
**Недостатки RDB:**
|
||||
- **Потенциальная потеря данных**: Поскольку RDB создаёт снимки только через определённые промежутки времени, можно потерять все изменения, которые произошли с момента последнего снапшота, в случае сбоя Redis. Если снапшот создавался 15 минут назад, то при сбое вы потеряете все изменения, сделанные за эти 15 минут.
|
||||
- **Тяжелые операции на большом объеме данных**: Процесс создания снапшота может потреблять значительные ресурсы, особенно в крупных базах данных, что может влиять на производительность Redis на время создания снимка.
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Redis|00 Redis]]
|
||||
**Родитель**::
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-10-07]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
- [[Append-Only File]]
|
||||
|
||||
### Дочерние заметки
|
||||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||||
|
@ -26,7 +26,7 @@ Keys - команда, которая ищет ключи по маске. Ис
|
||||
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../../wiki/zero/00 Redis|00 Redis]]
|
||||
**Область**:: [[../../meta/zero/00 Redis|00 Redis]]
|
||||
**Родитель**::
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-11-03]]
|
@ -8,18 +8,18 @@ date: 2024-11-03
|
||||
|
||||
- `stop-writes-on-bg-save-error`. Если на snapshot возникает какая-то проблема, то Redis перестает работать. По умолчанию yes. Обычно рекомендуется отключать. Тогда могут возникнуть проблемы с персистентностью, но хотя бы память озу будет работать.
|
||||
- `rdbcompression`. Немного влияет негативно на производительность, но уменьшает размер хранимых данных.
|
||||
- `save <seconds> <changes>`. **Триггеры создания снапшотов** [[../../../_inbox/Redis Database Backup|RDB]]:
|
||||
- `save <seconds> <changes>`. **Триггеры создания снапшотов** [[system-design/Redis Database Backup|RDB]]:
|
||||
- save 900 1 — сохранить снапшот, если в течение последних 900 секунд (15 минут) было выполнено хотя бы 1 изменение.
|
||||
- save 300 10 — сохранить снапшот, если за последние 300 секунд (5 минут) было выполнено 10 изменений.
|
||||
- save 60 10000 — сохранить снапшот, если за последние 60 секунд (1 минута) было выполнено 10 000 изменений.
|
||||
- [[../../../_inbox/Append-Only File|appendonly]]
|
||||
- [[system-design/Append-Only File|appendonly]]
|
||||
- Можно указать [[algorithm/Алгоритм вытеснения кэша|Алгоритмы вытеснения]] ключей
|
||||
- `oom-score-adj-values`
|
||||
- `disable-thp`. Лучше выключить. По умолчанию выключено.
|
||||
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../../wiki/zero/00 Redis|00 Redis]]
|
||||
**Область**:: [[../../meta/zero/00 Redis|00 Redis]]
|
||||
**Родитель**::
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-11-03]]
|
@ -2,6 +2,7 @@
|
||||
aliases:
|
||||
- читаемость кода
|
||||
- читаемости кода
|
||||
- читаем код
|
||||
tags:
|
||||
- maturity/🌱
|
||||
- content/opinion
|
||||
|
BIN
meta/files/images/Pasted image 20241103220121.png
Normal file
After Width: | Height: | Size: 650 KiB |
BIN
meta/files/images/Pasted image 20241103220807.png
Normal file
After Width: | Height: | Size: 1.1 MiB |
BIN
meta/files/images/Pasted image 20241103220925.png
Normal file
After Width: | Height: | Size: 1013 KiB |
BIN
meta/files/images/Pasted image 20241103221422.png
Normal file
After Width: | Height: | Size: 1.1 MiB |
BIN
meta/files/images/Pasted image 20241103222207 1.png
Normal file
After Width: | Height: | Size: 1.2 MiB |
BIN
meta/files/images/Pasted image 20241103222301.png
Normal file
After Width: | Height: | Size: 759 KiB |
BIN
meta/files/images/comp/Pasted image 20241103220121.png
Normal file
After Width: | Height: | Size: 123 KiB |
@ -0,0 +1 @@
|
||||
1925a6181fc68dd673a6476b2f5e76c6
|
@ -0,0 +1 @@
|
||||
Ошибка при сжатии ./images/Pasted image 20241103220807.png с помощью pngquant
|
BIN
meta/files/images/comp/Pasted image 20241103220925.png
Normal file
After Width: | Height: | Size: 355 KiB |
@ -0,0 +1 @@
|
||||
d7cda56f310c74fbcaea57cde8387c8d
|
BIN
meta/files/images/comp/Pasted image 20241103221422.png
Normal file
After Width: | Height: | Size: 294 KiB |
@ -0,0 +1 @@
|
||||
de0a7b16bcf77d9208f27632eceb284a
|
BIN
meta/files/images/comp/Pasted image 20241103222207 1.png
Normal file
After Width: | Height: | Size: 253 KiB |
@ -0,0 +1 @@
|
||||
80447eaaebbd6bb5233abff9bea860f0
|
BIN
meta/files/images/comp/Pasted image 20241103222301.png
Normal file
After Width: | Height: | Size: 156 KiB |
@ -0,0 +1 @@
|
||||
568b96ef76df1f96e79a893c01ccfb18
|
BIN
meta/files/images/webp/Pasted image 20241103220121.webp
Normal file
After Width: | Height: | Size: 145 KiB |
@ -0,0 +1 @@
|
||||
1925a6181fc68dd673a6476b2f5e76c6
|
BIN
meta/files/images/webp/Pasted image 20241103220807.webp
Normal file
After Width: | Height: | Size: 139 KiB |
@ -0,0 +1 @@
|
||||
e4cc45cfe3c01955aa49ee41fe7eb075
|
BIN
meta/files/images/webp/Pasted image 20241103220925.webp
Normal file
After Width: | Height: | Size: 169 KiB |
@ -0,0 +1 @@
|
||||
d7cda56f310c74fbcaea57cde8387c8d
|
BIN
meta/files/images/webp/Pasted image 20241103221422.webp
Normal file
After Width: | Height: | Size: 136 KiB |
@ -0,0 +1 @@
|
||||
de0a7b16bcf77d9208f27632eceb284a
|
BIN
meta/files/images/webp/Pasted image 20241103222207 1.webp
Normal file
After Width: | Height: | Size: 243 KiB |
@ -0,0 +1 @@
|
||||
80447eaaebbd6bb5233abff9bea860f0
|
BIN
meta/files/images/webp/Pasted image 20241103222301.webp
Normal file
After Width: | Height: | Size: 139 KiB |
@ -0,0 +1 @@
|
||||
568b96ef76df1f96e79a893c01ccfb18
|
@ -21,7 +21,7 @@ Docker — это платформа с открытым исходным код
|
||||
- [Очистка мусора в Docker](Очистка%20мусора%20в%20Docker.md)
|
||||
- [Настройка ротации логов в Docker](Настройка%20ротации%20логов%20в%20Docker.md)
|
||||
|
||||
![[../files/images/Pasted image 20241103035418.png]]
|
||||
![[../files/images/Pasted image 20241103220121.png]]
|
||||
|
||||
В архитектуре Docker выделяют 3 основных компонента:
|
||||
- **Docker client**: Клиент Docker взаимодействует с демоном Docker.
|
||||
|
@ -18,4 +18,5 @@ git init --separate-git-dir=/path/to/my-git-storage /path/to/my-project
|
||||
|
||||
![[../files/images/Pasted image 20241103182733.png]]
|
||||
|
||||
![[../files/images/git-merge-git-rebase.jpeg]]
|
||||
![[../files/images/git-merge-git-rebase.jpeg]]
|
||||
![[../files/images/Pasted image 20241103220807.png]]
|
@ -59,7 +59,7 @@ title: Java разработка
|
||||
- [Не используйте @Data](../../dev/java/Не%20используйте%20@Data.md)
|
||||
- [Возвращайте пустую коллекцию вместо null](../../dev/java/Возвращайте%20пустую%20коллекцию%20вместо%20null.md)
|
||||
- [[../../dev/java/Границы применимости Tuple и Pair в разработке|Границы применимости Tuple и Pair в разработке]]
|
||||
- [[../../dev/Не используйте var в Java|Не используйте var в Java]]
|
||||
- [[../../dev/java/Не используйте var в Java|Не используйте var в Java]]
|
||||
## Дополнительно
|
||||
- [Нативные сборки в Java](../../dev/java/Нативные%20сборки%20в%20Java.md)
|
||||
|
||||
|
65
meta/zero/00 Redis.md
Normal file
@ -0,0 +1,65 @@
|
||||
---
|
||||
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). Но при этом может страдать надежность доставки.
|
@ -7,4 +7,6 @@ parents:
|
||||
title: Криптография
|
||||
---
|
||||
- [[../../dev/cryptography/Хеш-функция|Хеш-функция]]
|
||||
- [Генерация аппаратного SSH ключа](../../dev/cryptography/Генерация%20аппаратного%20SSH%20ключа.md)
|
||||
- [Генерация аппаратного SSH ключа](../../dev/cryptography/Генерация%20аппаратного%20SSH%20ключа.md)
|
||||
|
||||
![[../../../../meta/files/Pasted image 20241103222207.png]]
|