diff --git a/dev/Code Review.md b/dev/Code Review.md new file mode 100644 index 00000000..e0351587 --- /dev/null +++ b/dev/Code Review.md @@ -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]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/architecture/highload/Ключ кэширования.md b/dev/architecture/highload/Ключ кэширования.md index 963a7b92..072b408f 100644 --- a/dev/architecture/highload/Ключ кэширования.md +++ b/dev/architecture/highload/Ключ кэширования.md @@ -19,11 +19,11 @@ public List getUsersByType(String userType, Set 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`. А вот для самого значения параметра есть несколько вариантов: - Оставить строкой и просто выполнить конкатенацию. diff --git a/dev/architecture/Кэширование в приложении.md b/dev/architecture/Кэширование в приложении.md index ed35c30c..ac119ec9 100644 --- a/dev/architecture/Кэширование в приложении.md +++ b/dev/architecture/Кэширование в приложении.md @@ -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) diff --git a/dev/fundamental/structure/Структура данных.md b/dev/fundamental/structure/Структура данных.md index 8530d846..0ebcb447 100644 --- a/dev/fundamental/structure/Структура данных.md +++ b/dev/fundamental/structure/Структура данных.md @@ -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|Дерево]] diff --git a/dev/fundamental/Процесс ОС.md b/dev/fundamental/Процесс ОС.md index 62a3e322..2339ad56 100644 --- a/dev/fundamental/Процесс ОС.md +++ b/dev/fundamental/Процесс ОС.md @@ -21,6 +21,8 @@ parents: Процесс содержит в себе [потоки](Поток%20процесса%20ОС.md). Под любой процесс создаются свои [Namespace](../linux/Namespace.md), которые позволяют изолировать процессы, запущенные на одном ядре друг от друга. + +![[../../meta/files/images/Pasted image 20241103221422.png]] *** ## Мета информация **Область**:: [[../../meta/zero/00 Архитектура ЭВМ|00 Архитектура ЭВМ]]] diff --git a/dev/Не используйте var в Java.md b/dev/java/Не используйте var в Java.md similarity index 64% rename from dev/Не используйте var в Java.md rename to dev/java/Не используйте var в Java.md index 26b5685c..4f4be578 100644 --- a/dev/Не используйте var в Java.md +++ b/dev/java/Не используйте var в Java.md @@ -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]] diff --git a/dev/system-design/Append-Only File.md b/dev/system-design/Append-Only File.md new file mode 100644 index 00000000..916d067d --- /dev/null +++ b/dev/system-design/Append-Only File.md @@ -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]] + +### Дочерние заметки + + diff --git a/dev/system-design/Redis Database Backup.md b/dev/system-design/Redis Database Backup.md new file mode 100644 index 00000000..1b2e8652 --- /dev/null +++ b/dev/system-design/Redis Database Backup.md @@ -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]] + +### Дочерние заметки + + diff --git a/dev/Команды Redis-cli.md b/dev/system-design/Команды Redis-cli.md similarity index 93% rename from dev/Команды Redis-cli.md rename to dev/system-design/Команды Redis-cli.md index 4837fa00..0ddb57dd 100644 --- a/dev/Команды Redis-cli.md +++ b/dev/system-design/Команды Redis-cli.md @@ -26,7 +26,7 @@ Keys - команда, которая ищет ключи по маске. Ис *** ## Мета информация -**Область**:: [[../../../wiki/zero/00 Redis|00 Redis]] +**Область**:: [[../../meta/zero/00 Redis|00 Redis]] **Родитель**:: **Источник**:: **Создана**:: [[2024-11-03]] diff --git a/dev/Конфигурация Redis.md b/dev/system-design/Конфигурация Redis.md similarity index 91% rename from dev/Конфигурация Redis.md rename to dev/system-design/Конфигурация Redis.md index c848b885..6ed4f62b 100644 --- a/dev/Конфигурация Redis.md +++ b/dev/system-design/Конфигурация Redis.md @@ -8,18 +8,18 @@ date: 2024-11-03 - `stop-writes-on-bg-save-error`. Если на snapshot возникает какая-то проблема, то Redis перестает работать. По умолчанию yes. Обычно рекомендуется отключать. Тогда могут возникнуть проблемы с персистентностью, но хотя бы память озу будет работать. - `rdbcompression`. Немного влияет негативно на производительность, но уменьшает размер хранимых данных. -- `save `. **Триггеры создания снапшотов** [[../../../_inbox/Redis Database Backup|RDB]]: +- `save `. **Триггеры создания снапшотов** [[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]] diff --git a/dev/Читаемый код.md b/dev/Читаемый код.md index ed583e3c..b4440406 100644 --- a/dev/Читаемый код.md +++ b/dev/Читаемый код.md @@ -2,6 +2,7 @@ aliases: - читаемость кода - читаемости кода + - читаем код tags: - maturity/🌱 - content/opinion diff --git a/meta/files/images/Pasted image 20241103220121.png b/meta/files/images/Pasted image 20241103220121.png new file mode 100644 index 00000000..7f048101 Binary files /dev/null and b/meta/files/images/Pasted image 20241103220121.png differ diff --git a/meta/files/images/Pasted image 20241103220807.png b/meta/files/images/Pasted image 20241103220807.png new file mode 100644 index 00000000..448ee8c8 Binary files /dev/null and b/meta/files/images/Pasted image 20241103220807.png differ diff --git a/meta/files/images/Pasted image 20241103220925.png b/meta/files/images/Pasted image 20241103220925.png new file mode 100644 index 00000000..0bc60491 Binary files /dev/null and b/meta/files/images/Pasted image 20241103220925.png differ diff --git a/meta/files/images/Pasted image 20241103221422.png b/meta/files/images/Pasted image 20241103221422.png new file mode 100644 index 00000000..f2c44a83 Binary files /dev/null and b/meta/files/images/Pasted image 20241103221422.png differ diff --git a/meta/files/images/Pasted image 20241103222207 1.png b/meta/files/images/Pasted image 20241103222207 1.png new file mode 100644 index 00000000..25b1a5a9 Binary files /dev/null and b/meta/files/images/Pasted image 20241103222207 1.png differ diff --git a/meta/files/images/Pasted image 20241103222301.png b/meta/files/images/Pasted image 20241103222301.png new file mode 100644 index 00000000..922f59bc Binary files /dev/null and b/meta/files/images/Pasted image 20241103222301.png differ diff --git a/meta/files/images/comp/Pasted image 20241103220121.png b/meta/files/images/comp/Pasted image 20241103220121.png new file mode 100644 index 00000000..3e031737 Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241103220121.png differ diff --git a/meta/files/images/comp/Pasted image 20241103220121.png.md5 b/meta/files/images/comp/Pasted image 20241103220121.png.md5 new file mode 100644 index 00000000..69e7e733 --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241103220121.png.md5 @@ -0,0 +1 @@ +1925a6181fc68dd673a6476b2f5e76c6 diff --git a/meta/files/images/comp/Pasted image 20241103220807.png.error b/meta/files/images/comp/Pasted image 20241103220807.png.error new file mode 100644 index 00000000..77e8d35d --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241103220807.png.error @@ -0,0 +1 @@ +Ошибка при сжатии ./images/Pasted image 20241103220807.png с помощью pngquant diff --git a/meta/files/images/comp/Pasted image 20241103220925.png b/meta/files/images/comp/Pasted image 20241103220925.png new file mode 100644 index 00000000..1d2075b2 Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241103220925.png differ diff --git a/meta/files/images/comp/Pasted image 20241103220925.png.md5 b/meta/files/images/comp/Pasted image 20241103220925.png.md5 new file mode 100644 index 00000000..c53ecabf --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241103220925.png.md5 @@ -0,0 +1 @@ +d7cda56f310c74fbcaea57cde8387c8d diff --git a/meta/files/images/comp/Pasted image 20241103221422.png b/meta/files/images/comp/Pasted image 20241103221422.png new file mode 100644 index 00000000..16432e81 Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241103221422.png differ diff --git a/meta/files/images/comp/Pasted image 20241103221422.png.md5 b/meta/files/images/comp/Pasted image 20241103221422.png.md5 new file mode 100644 index 00000000..ac51868d --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241103221422.png.md5 @@ -0,0 +1 @@ +de0a7b16bcf77d9208f27632eceb284a diff --git a/meta/files/images/comp/Pasted image 20241103222207 1.png b/meta/files/images/comp/Pasted image 20241103222207 1.png new file mode 100644 index 00000000..9b37ea56 Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241103222207 1.png differ diff --git a/meta/files/images/comp/Pasted image 20241103222207 1.png.md5 b/meta/files/images/comp/Pasted image 20241103222207 1.png.md5 new file mode 100644 index 00000000..d6dae1be --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241103222207 1.png.md5 @@ -0,0 +1 @@ +80447eaaebbd6bb5233abff9bea860f0 diff --git a/meta/files/images/comp/Pasted image 20241103222301.png b/meta/files/images/comp/Pasted image 20241103222301.png new file mode 100644 index 00000000..09e0ba36 Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241103222301.png differ diff --git a/meta/files/images/comp/Pasted image 20241103222301.png.md5 b/meta/files/images/comp/Pasted image 20241103222301.png.md5 new file mode 100644 index 00000000..29c53765 --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241103222301.png.md5 @@ -0,0 +1 @@ +568b96ef76df1f96e79a893c01ccfb18 diff --git a/meta/files/images/webp/Pasted image 20241103220121.webp b/meta/files/images/webp/Pasted image 20241103220121.webp new file mode 100644 index 00000000..9d6c3b79 Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241103220121.webp differ diff --git a/meta/files/images/webp/Pasted image 20241103220121.webp.md5 b/meta/files/images/webp/Pasted image 20241103220121.webp.md5 new file mode 100644 index 00000000..69e7e733 --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241103220121.webp.md5 @@ -0,0 +1 @@ +1925a6181fc68dd673a6476b2f5e76c6 diff --git a/meta/files/images/webp/Pasted image 20241103220807.webp b/meta/files/images/webp/Pasted image 20241103220807.webp new file mode 100644 index 00000000..f8430683 Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241103220807.webp differ diff --git a/meta/files/images/webp/Pasted image 20241103220807.webp.md5 b/meta/files/images/webp/Pasted image 20241103220807.webp.md5 new file mode 100644 index 00000000..7fc2d866 --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241103220807.webp.md5 @@ -0,0 +1 @@ +e4cc45cfe3c01955aa49ee41fe7eb075 diff --git a/meta/files/images/webp/Pasted image 20241103220925.webp b/meta/files/images/webp/Pasted image 20241103220925.webp new file mode 100644 index 00000000..cf50a92c Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241103220925.webp differ diff --git a/meta/files/images/webp/Pasted image 20241103220925.webp.md5 b/meta/files/images/webp/Pasted image 20241103220925.webp.md5 new file mode 100644 index 00000000..c53ecabf --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241103220925.webp.md5 @@ -0,0 +1 @@ +d7cda56f310c74fbcaea57cde8387c8d diff --git a/meta/files/images/webp/Pasted image 20241103221422.webp b/meta/files/images/webp/Pasted image 20241103221422.webp new file mode 100644 index 00000000..d9ecb302 Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241103221422.webp differ diff --git a/meta/files/images/webp/Pasted image 20241103221422.webp.md5 b/meta/files/images/webp/Pasted image 20241103221422.webp.md5 new file mode 100644 index 00000000..ac51868d --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241103221422.webp.md5 @@ -0,0 +1 @@ +de0a7b16bcf77d9208f27632eceb284a diff --git a/meta/files/images/webp/Pasted image 20241103222207 1.webp b/meta/files/images/webp/Pasted image 20241103222207 1.webp new file mode 100644 index 00000000..df8f68d0 Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241103222207 1.webp differ diff --git a/meta/files/images/webp/Pasted image 20241103222207 1.webp.md5 b/meta/files/images/webp/Pasted image 20241103222207 1.webp.md5 new file mode 100644 index 00000000..d6dae1be --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241103222207 1.webp.md5 @@ -0,0 +1 @@ +80447eaaebbd6bb5233abff9bea860f0 diff --git a/meta/files/images/webp/Pasted image 20241103222301.webp b/meta/files/images/webp/Pasted image 20241103222301.webp new file mode 100644 index 00000000..5ca63b53 Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241103222301.webp differ diff --git a/meta/files/images/webp/Pasted image 20241103222301.webp.md5 b/meta/files/images/webp/Pasted image 20241103222301.webp.md5 new file mode 100644 index 00000000..29c53765 --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241103222301.webp.md5 @@ -0,0 +1 @@ +568b96ef76df1f96e79a893c01ccfb18 diff --git a/meta/zero/00 Docker.md b/meta/zero/00 Docker.md index 704d79c2..915fed4f 100644 --- a/meta/zero/00 Docker.md +++ b/meta/zero/00 Docker.md @@ -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. diff --git a/meta/zero/00 Git.md b/meta/zero/00 Git.md index 962280df..004b36ae 100644 --- a/meta/zero/00 Git.md +++ b/meta/zero/00 Git.md @@ -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]] \ No newline at end of file +![[../files/images/git-merge-git-rebase.jpeg]] +![[../files/images/Pasted image 20241103220807.png]] \ No newline at end of file diff --git a/meta/zero/00 Java разработка.md b/meta/zero/00 Java разработка.md index 8402ab12..b4af2616 100644 --- a/meta/zero/00 Java разработка.md +++ b/meta/zero/00 Java разработка.md @@ -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) diff --git a/meta/zero/00 Redis.md b/meta/zero/00 Redis.md new file mode 100644 index 00000000..6d039ae9 --- /dev/null +++ b/meta/zero/00 Redis.md @@ -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). Но при этом может страдать надежность доставки. \ No newline at end of file diff --git a/meta/zero/00 Криптография.md b/meta/zero/00 Криптография.md index 4e1512c0..02e361d6 100644 --- a/meta/zero/00 Криптография.md +++ b/meta/zero/00 Криптография.md @@ -7,4 +7,6 @@ parents: title: Криптография --- - [[../../dev/cryptography/Хеш-функция|Хеш-функция]] -- [Генерация аппаратного SSH ключа](../../dev/cryptography/Генерация%20аппаратного%20SSH%20ключа.md) \ No newline at end of file +- [Генерация аппаратного SSH ключа](../../dev/cryptography/Генерация%20аппаратного%20SSH%20ключа.md) + +![[../../../../meta/files/Pasted image 20241103222207.png]] \ No newline at end of file