Обновление
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Struchkov Mark 2024-11-03 22:27:39 +03:00
parent 935f64fcf2
commit 5c31e845f5
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C
45 changed files with 230 additions and 17 deletions

52
dev/Code Review.md Normal file
View 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) -->

View File

@ -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`. А вот для самого значения параметра есть несколько вариантов:
- Оставить строкой и просто выполнить конкатенацию.

View File

@ -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)

View File

@ -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|Дерево]]

View File

@ -21,6 +21,8 @@ parents:
Процесс содержит в себе [потоки](Поток%20процесса%20ОС.md).
Под любой процесс создаются свои [Namespace](../linux/Namespace.md), которые позволяют изолировать процессы, запущенные на одном ядре друг от друга.
![[../../meta/files/images/Pasted image 20241103221422.png]]
***
## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ЭВМ|00 Архитектура ЭВМ]]]

View File

@ -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]]

View 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) -->

View 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) -->

View File

@ -26,7 +26,7 @@ Keys - команда, которая ищет ключи по маске. Ис
***
## Мета информация
**Область**:: [[../../../wiki/zero/00 Redis|00 Redis]]
**Область**:: [[../../meta/zero/00 Redis|00 Redis]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-11-03]]

View File

@ -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]]

View File

@ -2,6 +2,7 @@
aliases:
- читаемость кода
- читаемости кода
- читаем код
tags:
- maturity/🌱
- content/opinion

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1013 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

View File

@ -0,0 +1 @@
1925a6181fc68dd673a6476b2f5e76c6

View File

@ -0,0 +1 @@
Ошибка при сжатии ./images/Pasted image 20241103220807.png с помощью pngquant

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

View File

@ -0,0 +1 @@
d7cda56f310c74fbcaea57cde8387c8d

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

View File

@ -0,0 +1 @@
de0a7b16bcf77d9208f27632eceb284a

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

View File

@ -0,0 +1 @@
80447eaaebbd6bb5233abff9bea860f0

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

View File

@ -0,0 +1 @@
568b96ef76df1f96e79a893c01ccfb18

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

View File

@ -0,0 +1 @@
1925a6181fc68dd673a6476b2f5e76c6

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

View File

@ -0,0 +1 @@
e4cc45cfe3c01955aa49ee41fe7eb075

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

View File

@ -0,0 +1 @@
d7cda56f310c74fbcaea57cde8387c8d

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

View File

@ -0,0 +1 @@
de0a7b16bcf77d9208f27632eceb284a

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

View File

@ -0,0 +1 @@
80447eaaebbd6bb5233abff9bea860f0

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

View File

@ -0,0 +1 @@
568b96ef76df1f96e79a893c01ccfb18

View File

@ -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.

View File

@ -19,3 +19,4 @@ 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/Pasted image 20241103220807.png]]

View File

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

View File

@ -8,3 +8,5 @@ title: Криптография
---
- [[../../dev/cryptography/Хеш-функция|Хеш-функция]]
- [Генерация аппаратного SSH ключа](../../dev/cryptography/Генерация%20аппаратного%20SSH%20ключа.md)
![[../../../../meta/files/Pasted image 20241103222207.png]]