Базы данных NoSQL (not only SQL — не только SQL) значительно отличаются от традиционных реляционных систем управления базами данных (РСУБД). Если в РСУБД для хранения данных используются таблицы, строки и столбцы, то базы данных NoSQL предназначены для хранения и управления большими объемами неструктурированных, полуструктурированных или по-разному структурированных данных.
Рассмотрим все особенности баз данных NoSQL, изучим их типы, характеристики и причины, по которым они становятся все более предпочтительными в некоторых приложениях.
Что такое базы данных NoSQL?
Базы данных NoSQL возникли как решение проблем, связанных с большими данными и веб-приложениями, работающими в режиме реального времени. Отличаясь высокой скоростью и гибкостью, они особенно хорошо справляются с большими наборами распределенных данных.
Ключевой особенностью баз данных NoSQL является их бессхемность, которая позволяет хранить данные в формате, не требующем предопределенной схемы. Такая гибкость позволяет вносить изменения в базу данных по ходу работы, что является значительным преимуществом в приложениях, где требования постоянно меняются.
Типы баз данных NoSQL
Базы данных NoSQL можно разделить на четыре основных типа, каждый из которых обладает уникальными характеристиками и возможностями использования.
1. Документо-ориентированные базы данных (MongoDB)
Документо-ориентированные базы данных хранят данные в JSON-подобных форматах, известных как документы. Эти документы могут содержать разнообразные и вложенные структуры данных, что позволяет создавать более сложные и иерархические хранилища данных. Этот формат особенно полезен для приложений, работающих с данными, которые не помещаются в таблицы и строки, например для систем управления контентом и платформ электронной коммерции.
Ключевые особенности:
📌 Читать
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет 🚀 JUnit 5 🚀
Повторяющиеся тесты с помощью
Используйте
https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/RepeatedTest.html
#JUnit5 #Java
@javatg
Повторяющиеся тесты с помощью
@RepeatedTest
Используйте
@RepeatedTest
для запуска одного и того же теста несколько раз, каждый раз с разными входными данными или условиями, что особенно полезно для тестирования. 🔥https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/RepeatedTest.html
#JUnit5 #Java
@javatg
Kotlin изнутри: как работают inline-функции
Часто проводя технические собеседования, я пришел к выводу, что многие разработчики не понимают, в чем польза inline-функций, зачем нужен crossinline и как работает reified. Причина распространенных заблуждений насчет inline-функций отчасти заключается в неточном их описании, ранее опубликованном на сайте kotlinlang.org. Хочу развенчать эти заблуждения и наглядно показать, как работают inline-функции (встраиваемые) и в чем преимущество их использования.
Заблуждение 1-е: inline-функции экономят стек
Допустим, вы пытаетесь создать такую inline-функцию:
В этом случае компилятор выдаст предупреждение: “Expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of functional types” (“Ожидаемое влияние встраивания на производительность незначительно. Встраивание лучше всего работает для функций с параметрами функциональных типов”). Это примерно означает, что JIT-компилятор сам прекрасно справляется с встраиванием кода и не нужно пытаться ему в этом помочь.
Inline-функции следует использовать только при передаче в функцию параметров функционального типа.
📌 Продолжение
@javatg
Часто проводя технические собеседования, я пришел к выводу, что многие разработчики не понимают, в чем польза inline-функций, зачем нужен crossinline и как работает reified. Причина распространенных заблуждений насчет inline-функций отчасти заключается в неточном их описании, ранее опубликованном на сайте kotlinlang.org. Хочу развенчать эти заблуждения и наглядно показать, как работают inline-функции (встраиваемые) и в чем преимущество их использования.
Заблуждение 1-е: inline-функции экономят стек
Допустим, вы пытаетесь создать такую inline-функцию:
private inline fun warningInlineFun(a: Int, b: Int): Int {
return a + b
}
В этом случае компилятор выдаст предупреждение: “Expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of functional types” (“Ожидаемое влияние встраивания на производительность незначительно. Встраивание лучше всего работает для функций с параметрами функциональных типов”). Это примерно означает, что JIT-компилятор сам прекрасно справляется с встраиванием кода и не нужно пытаться ему в этом помочь.
Inline-функции следует использовать только при передаче в функцию параметров функционального типа.
📌 Продолжение
@javatg
Байт-код Java: назначение, структура и использование
Байт-код Java — это промежуточное представление Java-кода, которое выполняется виртуальной машиной Java (JVM). При компиляции Java-программы компилятор Java (javac) преобразует ее в байт-код, представляющий собой набор инструкций, которые JVM может понять и выполнить. Этот байт-код является платформонезависимым, то есть одна и та же Java-программа может выполняться на различных устройствах и в различных операционных системах, следуя принципу “пиши один раз, выполняй везде” (WORA).
Особенности байт-кода Java
Байт-код Java является важнейшим элементом в сфере программирования на Java. Он служит связующим звеном между высокоуровневым Java-кодом и низкоуровневыми операциями, выполняемыми в виртуальной машине Java (JVM). Рассмотрим подробно, что такое байт-код Java, как он устроен и зачем необходим Java-программам.
Что такое байт-код Java?
Байт-код Java — это продукт процесса компиляции исходного Java-кода. Когда вы пишете Java-программу и компилируете ее, компилятор Java (javac) не преобразует код непосредственно в машинный. Вместо этого он переводит его в промежуточную форму, называемую байт-кодом. Этот байт-код представляет собой набор инструкций, которые не являются человекочитаемыми, как Java-код, но менее сложны, чем машинный код.
Структура байт-кода
Длина каждой инструкции в байт-коде Java равна одному байту (откуда и происхождение термина “байт-код”). Однако за некоторыми инструкциями следуют дополнительные байты, представляющие собой операнды для инструкций. Инструкции байт-кода, разработанные для компактности и эффективности, работают на основе стековой архитектуры. В этом их отличие от большинства физических архитектур процессоров, основанных на регистрах.
Вот более подробный обзор структуры байт-кода.
📌 Читать
@javatg
Байт-код Java — это промежуточное представление Java-кода, которое выполняется виртуальной машиной Java (JVM). При компиляции Java-программы компилятор Java (javac) преобразует ее в байт-код, представляющий собой набор инструкций, которые JVM может понять и выполнить. Этот байт-код является платформонезависимым, то есть одна и та же Java-программа может выполняться на различных устройствах и в различных операционных системах, следуя принципу “пиши один раз, выполняй везде” (WORA).
Особенности байт-кода Java
Байт-код Java является важнейшим элементом в сфере программирования на Java. Он служит связующим звеном между высокоуровневым Java-кодом и низкоуровневыми операциями, выполняемыми в виртуальной машине Java (JVM). Рассмотрим подробно, что такое байт-код Java, как он устроен и зачем необходим Java-программам.
Что такое байт-код Java?
Байт-код Java — это продукт процесса компиляции исходного Java-кода. Когда вы пишете Java-программу и компилируете ее, компилятор Java (javac) не преобразует код непосредственно в машинный. Вместо этого он переводит его в промежуточную форму, называемую байт-кодом. Этот байт-код представляет собой набор инструкций, которые не являются человекочитаемыми, как Java-код, но менее сложны, чем машинный код.
Структура байт-кода
Длина каждой инструкции в байт-коде Java равна одному байту (откуда и происхождение термина “байт-код”). Однако за некоторыми инструкциями следуют дополнительные байты, представляющие собой операнды для инструкций. Инструкции байт-кода, разработанные для компактности и эффективности, работают на основе стековой архитектуры. В этом их отличие от большинства физических архитектур процессоров, основанных на регистрах.
Вот более подробный обзор структуры байт-кода.
📌 Читать
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Spring Совет 🚀
Распределенные системы должны проектироваться с учетом отказов. В настоящее время в мире приняты микросервисы, и эти сервисы в основном зависят от других удаленных сервисов. Эти удаленные службы могут не реагировать вовремя по различным причинам, таким как сеть, загрузка приложений и т.д. В большинстве случаев, реализация повторных попыток должна быть способна решить проблемы.
Но иногда могут быть серьезные проблемы, такие как деградация служб или полный отказ служб сам по себе. Бессмысленно продолжать повторные попытки в таких случаях. В этом случае может быть полезна модель автоматического выключателя (Circuit Breaker).
Если вы используете API шлюзы или прокси–серверы вроде Envoy, то это может быть достигнуто на самом прокси–уровне.
Примечание: Очень важно, чтобы было реализовано достаточное количество логов и предупреждений, когда цепь открыта, чтобы отслеживать запросы, полученные в течение этого времени, и чтобы операционная команда знала об этом.
Вы также можете реализовать автоматический выключатель с разомкнутой наполовину цепью, чтобы продолжать обслуживать клиентов с ослабленным обслуживанием.
Когда стоит использовать этот паттерн
Когда служба зависит от другого удаленного сервиса, и в некоторых сценариях она, скорее всего, откажет.
Когда служба имеет очень сильную зависимость (например, службы master data).
Когда не стоит использовать этот паттерн
Когда вы имеете дело с локальными зависимостями — автоматический выключатель может создать накладные расходы.
Reselience4J, позволяет реализовывать этот шаблон очень легко.
🔥
https://resilience4j.readme.io
@javatg
Распределенные системы должны проектироваться с учетом отказов. В настоящее время в мире приняты микросервисы, и эти сервисы в основном зависят от других удаленных сервисов. Эти удаленные службы могут не реагировать вовремя по различным причинам, таким как сеть, загрузка приложений и т.д. В большинстве случаев, реализация повторных попыток должна быть способна решить проблемы.
Но иногда могут быть серьезные проблемы, такие как деградация служб или полный отказ служб сам по себе. Бессмысленно продолжать повторные попытки в таких случаях. В этом случае может быть полезна модель автоматического выключателя (Circuit Breaker).
Если вы используете API шлюзы или прокси–серверы вроде Envoy, то это может быть достигнуто на самом прокси–уровне.
Примечание: Очень важно, чтобы было реализовано достаточное количество логов и предупреждений, когда цепь открыта, чтобы отслеживать запросы, полученные в течение этого времени, и чтобы операционная команда знала об этом.
Вы также можете реализовать автоматический выключатель с разомкнутой наполовину цепью, чтобы продолжать обслуживать клиентов с ослабленным обслуживанием.
Когда стоит использовать этот паттерн
Когда служба зависит от другого удаленного сервиса, и в некоторых сценариях она, скорее всего, откажет.
Когда служба имеет очень сильную зависимость (например, службы master data).
Когда не стоит использовать этот паттерн
Когда вы имеете дело с локальными зависимостями — автоматический выключатель может создать накладные расходы.
Reselience4J, позволяет реализовывать этот шаблон очень легко.
🔥
https://resilience4j.readme.io
@javatg
💥 Spring Boot and Thymeleaf library for htmx
Этот проект предоставляет аннотации, вспомогательные классы и синатксис Thymeleaf, чтобы упростить работу с htmx в приложении Spring Boot.
Более подробную информацию о htmx можно найти на в доккументации.
▪Github
@javatg
Этот проект предоставляет аннотации, вспомогательные классы и синатксис Thymeleaf, чтобы упростить работу с htmx в приложении Spring Boot.
Более подробную информацию о htmx можно найти на в доккументации.
▪Github
@javatg
«Я вообще нифига не понимаю. И скоро это поймут»: умелец устроился на работу Senior java-разработчиком на ₽300,000 сразу после курсов.
Он наврал в резюме, а теперь ищет спеца, на которого скинет всю работу за 50% от зарплаты.
Ждем курса от умельца, как устроиться Senior разработчиком без навыков и опыта.
@javatg
Он наврал в резюме, а теперь ищет спеца, на которого скинет всю работу за 50% от зарплаты.
Ждем курса от умельца, как устроиться Senior разработчиком без навыков и опыта.
@javatg
🚀 Spring совет 🚀
Служебный класс для работы с веб-задачами, такими как извлечение параметров запроса, обработка составных запросов и управление файлами cookie. 🔥
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/util/WebUtils.html
#Spring #java
@javatg
WebUtils
Служебный класс для работы с веб-задачами, такими как извлечение параметров запроса, обработка составных запросов и управление файлами cookie. 🔥
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/util/WebUtils.html
#Spring #java
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Oblivion обеспечивает безопасный, оптимизированный доступ в интернет через приложение для Android, написанное на Java с использованием технологии cloudflare warp.
Используя
bepass-sdk
и WireGuard
, инструмент предназначен для быстрого и конфиденциального доступа в интернет.▪Github
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Совет по Java API🚀
Отслеживайте события файловой системы в режиме реального времени.
Инструмент для обнаружения изменений в файлах и каталогах независимым от платформы способом. 🔥
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/nio/file/WatchService.html
#Java #JavaAPI
@javatg
java.nio.file.WatchService
Отслеживайте события файловой системы в режиме реального времени.
Инструмент для обнаружения изменений в файлах и каталогах независимым от платформы способом. 🔥
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/nio/file/WatchService.html
#Java #JavaAPI
@javatg
Совет Spring Framework💡
Optional — это контейнер, который может содержать какое-то значение или не содержать ничего.
Он используется для обозначения отсутствия значения вместо null. Это позволяет избежать ошибок
Optional появился в Java 8. Он представлен классом java.util.Optional.
Чтобы создать экземпляр Optional, используются статические методы:
—
—
Для получения значения из Optional используются методы
Вы можете инжектировать (autowire) бины, которые могут отсутствовать, обернув их в
Таким образом вы сообщаете, что этот бин является необязательным, избегаете исключения, если он не существует, и можете аккуратно обработать его отсутствие с помощью Optional API.
@javatg
Optional — это контейнер, который может содержать какое-то значение или не содержать ничего.
Он используется для обозначения отсутствия значения вместо null. Это позволяет избежать ошибок
NullPointerException.
Optional появился в Java 8. Он представлен классом java.util.Optional.
Чтобы создать экземпляр Optional, используются статические методы:
—
empty()
для пустого Optional.—
of()
для Optional с заданным значением.Для получения значения из Optional используются методы
get()
, или orElse()
с указанием значения по умолчанию. Также есть методы фильтрации значений, например filter(), map() и flatMap().
Вы можете инжектировать (autowire) бины, которые могут отсутствовать, обернув их в
java.util.Optional
. Таким образом вы сообщаете, что этот бин является необязательным, избегаете исключения, если он не существует, и можете аккуратно обработать его отсутствие с помощью Optional API.
@javatg
💫 Встречайте #ApachePekko - фреймворк с открытым исходным кодом, предназначенный для упрощения разработки параллельных, распределенных, устойчивых и эластичных приложений.
Pekko позволяет разработчикам сосредоточиться на бизнес-логике, а не на низкоуровневых деталях реализации.
▪Подробнее
▪Github
@javatg
Pekko позволяет разработчикам сосредоточиться на бизнес-логике, а не на низкоуровневых деталях реализации.
▪Подробнее
▪Github
@javatg
☕ Machine Learning на Java
Если вы пишете на Java или осваиваете язык, то вам пригодится этот репозиторий с множеством полезных ссылок на фреймворки и библиотеки. Список обширный, в том числе есть инструменты для работы с большими данными и машинным обучением. Например:
▪️Deeplearning4J — набор инструментов для глубокого обучения
▪️Weka — коллекция алгоритмов машинного обучения
▪️MALLET — библиотека для обработки естественного языка
🔗 репозиторий
Если вы пишете на Java или осваиваете язык, то вам пригодится этот репозиторий с множеством полезных ссылок на фреймворки и библиотеки. Список обширный, в том числе есть инструменты для работы с большими данными и машинным обучением. Например:
▪️Deeplearning4J — набор инструментов для глубокого обучения
▪️Weka — коллекция алгоритмов машинного обучения
▪️MALLET — библиотека для обработки естественного языка
🔗 репозиторий
🚀 Spring Совет 🚀
Утилитный класс для сравнения объектов на основе
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/AnnotationAwareOrderComparator.html
@javatg
AnnotationAwareOrderComparator
Утилитный класс для сравнения объектов на основе
@Order
или аннотации Ordered
. Он используется там, где необходимо определить порядок выполнения компонентов. 🔥https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/AnnotationAwareOrderComparator.html
@javatg
Spring AI 0.8.0 уже доступен 🎉
Он предоставляет удобный API для моделей искусственного интеллекта, API для хранения векторов, вызов функций, ETL-фреймворк для инженерии данных с Spring Boot.
https://spring.io/blog/2024/02/23/spring-ai-0-8-0-released
Примеры работы: https://github.com/ThomasVitale/llm-apps-java-spring-ai
@javatg
Он предоставляет удобный API для моделей искусственного интеллекта, API для хранения векторов, вызов функций, ETL-фреймворк для инженерии данных с Spring Boot.
https://spring.io/blog/2024/02/23/spring-ai-0-8-0-released
Примеры работы: https://github.com/ThomasVitale/llm-apps-java-spring-ai
@javatg