es
Feedback
Секреты Java

Секреты Java

Ir al canal en Telegram

Обсуждаем Java, архитектуру, фреймворки и всё, о чем должны говорить разработчики. Владелец: @Alexey_Morl Реклама на бирже: https://telega.in/c/java_secrets

Mostrar más
7 991
Suscriptores
Sin datos24 horas
Sin datos7 días
Sin datos30 días
Archivo de publicaciones
#test
#test

✅ CHARACTER(n) и CHARACTER VARYING(n) Есть два основных символьных типа данных для хранения текстовой информации в БД: charac
CHARACTER(n) и CHARACTER VARYING(n) Есть два основных символьных типа данных для хранения текстовой информации в БД: character (n) и character varying(n). Разберемся, что это за фрукты и с чем их едят на примере использования СУБД Postgres. Character Тип данных character(n) используется для хранения текстовой информации длиной до n символов(не байт, дальше расскажу почему). Если длина не указана, то по умолчанию character соответствует character(1). При сохранении строки меньше объявленной длины, оставшиеся символы заполняются пробелами. Однако, это может быть неэффективно с точки зрения использования памяти. Можем с легкостью в этом убедиться:
//Создадим таблицу c 1-им полем
CREATE TABLE example (a character(10));
//Закинем в неё данные
INSERT INTO example VALUES ('test');
//Выведем полученный результат и и посмотрим какое количество байт они занимают
SELECT a, pg_column_size(a),char_length(a) FROM example;
Получаем:
|  a  |pg_column_size|char_length|
|-----|--------------|-----------|
|test |11            |4          | 
Как видим слово "test" занимает 11 байт. 10 байт занимает само слово и заполненные пробелы, а 1 байт выделен в памяти для хранения длины записанной строки. Но это если строка занимает меньше 126 байт (как в приведенном примере). В ином случае будет использоваться другая форма записи строки и для заголовка будет выделено 4 байта. Да строки хранятся в определенной структуре у которой есть как "заголовок" так и "тело". Сharacter varying Тип данных character varying(n) также используется для хранения текстовой информации длиной до n символов. Однако, в отличие от character, character varying не заполняет оставшиеся символы пробелами, а просто сохраняет строку без изменений, выделяя только необходимое количество памяти. Character varying, в свою очередь без указания длины, может принимать строки любой длины до 1 Гб. Давайте убедимся в том что пробелов нет:
CREATE TABLE example2 (a character varying(10));
INSERT INTO example2 VALUES ('test'), ('тест');
SELECT a, pg_column_size(a),char_length(a) FROM example2;
Получаем:
|  a  |pg_column_size|char_length|
|-----|--------------|-----------|
|test |5             |4          |
|тест |9             |4          |
Небольшой оффтоп: Почему слово на русском языке занимает в 2 раза больше места? Всё дело в кодировке. В стандартной кодировке UTF-8 для кириллицы выделены 6 блоков 2-х байтового диапазона кодирования символов. Поэтому символы кириллицы занимают 2 байта :) Как мы видим, character (n) имеет фиксированную длину строки и всегда занимает определенное количество байт памяти, даже если строка окажется короче этой длины. Varchar (n) же в свою очередь динамически выделяет память в зависимости от фактической длины строки, что позволяет более эффективно использовать память. Также к плюсам varchar (n) можно отнести её стандартный размер длины строки (~1ГБ), что позволяет не задумываться о длине строки в большинстве случаев. n - это всего лишь ограничение на количество данных. Формат хранения от этого не зависит. При попытке записать строку большей длины мы просто получим ошибку) А занимает ли место NULL? Да, занимает. 1 бит в виде флага) 🫡 Секреты Java #sql #postgres #varchar #char

Java Джуниоры! Важное объявление FAANG School в течение 24 часов отдают бесплатно свою библиотеку знаний. Вы можете получить
Java Джуниоры! Важное объявление FAANG School в течение 24 часов отдают бесплатно свою библиотеку знаний. Вы можете получить доступ: – Подробный гайд, как найти работу в IT без опыта – Подборка платформ с вакансиями для java-разработчиков – Пошаговая RoadMap по Java – Мануал по Docker. Основные команды и концепции – Микросервисы. Вопросы с собеседований – Шпаргалка с горячими клавишами JetBrains IDE. Ускоришь работу в 10 раз – Desk setup. Подборка аксессуаров для комфортной работы – Шпаргалка по Kafka Библиотека знаний постоянно пополняется, но бесплатный доступ длится всего сутки. Чтобы получить полезные материалы, переходи по ссылке и жми на оранжевую кнопку.

✅ Аннотация Spring @Cacheable @Cacheable — это аннотация, которая позволяет кэшировать результат выполнения метода. При повто
Аннотация Spring @Cacheable @Cacheable — это аннотация, которая позволяет кэшировать результат выполнения метода. При повторном вызове метода с теми же параметрами, результат будет извлекаться из кэша, вместо того чтобы метод выполнялся заново. Это особенно полезно для дорогостоящих операций, таких как запросы в базу данных или вычисления. Чтобы использовать кэширование необходимо добавить следующую зависимость:
implementation 'org.springframework.boot:spring-boot-starter-cache'
Не забудьте добавить аннотацию @EnableCaching для включения кэширования:
@SpringBootApplication
@EnableCaching
public class RedisExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(RedisExampleApplication.class, args);
    }
}
Методы, результат выполнения которых должен кэшироваться, можно пометить одной из следующих аннотаций: ▫️@Cacheable - при вызове метода, помеченного этой аннотацией, Spring проверяет наличие в кэше данных, соответствующих параметрам, с которыми был вызван этот метода. Если результат найден, метод не выполняется, иначе кэширует результат выполнения метода.
@Cacheable("users")
public User getUserById(Long id) {
    return userRepository.findById(id).orElse(null);
}
▫️@CachePut - В отличие от @Cacheable, аннотация @CachePut всегда выполняет метод, даже если кэш уже содержит данные. После выполнения метода результат помещается в кэш. Это полезно, когда необходимо обновить кэшированные данные, например, после изменения информации в базе данных. Таким образом, @CachePut позволяет гарантировать, что кэш всегда содержит актуальные данные.
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
    return userRepository.save(user);
}
Так же необходимо очищать кэш от неактуальных значений. Для этой цели существует аннотация @CacheEvict:
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
    userRepository.deleteById(id);
}
Spring предоставляет простой, но эффективный способ повысить скорость выполнения программ за счет кэширования результатов выполнения методов. Но следует внимательно выбирать данные для кэширования, так они будут хранится в оперативной памяти, и при чрезмерном кэшировании этот ресурс может быстро закончиться. 🫡 Секреты Java #java #spring #cacheable

Оплачиваемая стажировка и трудоустройство без опыта — ну ничего себе 😳 Все возможно с Добровольным квалификационным экзамено
Оплачиваемая стажировка и трудоустройство без опыта — ну ничего себе 😳 Все возможно с Добровольным квалификационным экзаменом! Это бесплатный проект Правительства Москвы, где ты можешь показать свои знания по специальности, запомниться потенциальным работодателям и получить оффер в престижные компании Москвы. Тебя ждет всего три шага: 1️⃣ Пройди тест После регистрации на сайте ДКЭ тебе будет доступно 70 профессий по 7 направлениям. Выбирай тест по своей специальности и проверь уровень своих знаний! 2️⃣ Реши кейс Если ты успешно сдал тест, тебя пригласят на следующий этап, где ты с другими участниками в команде будешь решать реальный кейс одного из работодателей. 3️⃣ Стань победителем Окажись в числе лучших по общему количеству баллов за оба этапа и получи шанс попасть на оплачиваемую стажировку с дальнейшим трудоустройством. Готов проявить себя? Регистрируйся и начинай проходить тест — https://dke.moscow Реклама. АНО "РАЗВИТИЕ ЧЕЛОВЕЧЕСКОГО КАПИТАЛА", АНО "РЧК". ИНН 7710364647. erid: LjN8Jv1iP

✅ Redis как брокер сообщений Redis не является брокером сообщений, но всё-таки позволяет реализовать простую модель обмена со
Redis как брокер сообщений Redis не является брокером сообщений, но всё-таки позволяет реализовать простую модель обмена сообщениями. В отличие от RabbitMQ и Kafka, с помощью Redis не получится настроить сложную маршрутизацию. Сообщения будут отправляться в определенные каналы, из которых подписчики будут получать данные. Для реализации обмена сообщений необходимо настроить подключение к Redis. Как это сделать, было рассказано в предыдущих статьях. Создадим класс для отправки сообщений в нужный топик(канал):
@Service
@RequiredArgsConstructor
public class Producer {

    private final RedisTemplate<String, String> redisTemplate;
    private final ChannelTopic channelTopic;

    public void produce(String message) {
        redisTemplate.convertAndSend(channelTopic.getTopic(), message);
    }
}
Данный класс публикует сообщение, используя RedisTemplate. Метод convertAndSend принимает название топика и само сообщение. В этом примере используется класс ChannelTopic из пакета org.springframework.data.redis.listener. Вместо этого можно передавать сроковое значение, которое будет содержать название очереди. Создадим класс, в котором будет содержаться логика обработки сообщений:
@Service
public class Receiver {

    public void handleMessage(String message) {
      System.out.println("Received: " + message);
    }
}
В классе конфигурации добавим следующие бины:
@Bean
public ChannelTopic channelTopic() {
    return new ChannelTopic("channel");
}
ChannelTopic - класс хранящий название топика для сообщений.
@Bean
public MessageListenerAdapter messageListenerAdapter(Receiver receiver) {
    return new MessageListenerAdapter(receiver);
}
MessageListenerAdapter - класс, являющийся подписчиком для топика. Этот класс делегирует обработку сообщения пользовательскому классу, который должен реализовывать интерфейс MessageListener либо содержать метод с названием handleMessage. Название метода можно изменить, но тогда при определении MessageListenerAdapter необходимо указать название метода, который будет получать сообщения.
@Bean
public RedisMessageListenerContainer сontainer(RedisConnectionFactory redisConnectionFactory,MessageListenerAdapter messageListenerAdapter, ChannelTopic channelTopic) {

    var container = new RedisMessageListenerContainer();
    container.setConnectionFactory(redisConnectionFactory);
    container.addMessageListener(messageListenerAdapter, channelTopic);
    return container;
}
RedisMessageListenerContainer - это класс, который обрабатывает низкоуровневые детали получения и преобразования сообщений. С помощью метода addMessageListener() указывается слушатель сообщений и название топика, из которого будут читаться данные. Redis может быть хорем выбор в качестве брокера сообщений из-за высокой скорости работы. Но если важна надежность, гарантия доставки сообщений и сложная маршрутизация, то лучше сделать выбор в пользу RabbitMQ или Kafka. 🫡 Секреты Java #java #spring #redis

Мечтаешь о карьере в бигтехе? Приходи на интенсив в Открытые школы Т1 для Java-разработчиков с опытом от года. Лучшие выпускн
Мечтаешь о карьере в бигтехе? Приходи на интенсив в Открытые школы Т1 для Java-разработчиков с опытом от года. Лучшие выпускники получат оффер от Т1 — крупнейшей ИТ-компании по версии RAEX 2023🔝 и уникальный карьерный фаст-трек до мидла в бигтехе. В портфеле Холдинга Т1 800+ масштабных проектов и 70+ продуктов и услуг. 🧠 Всего за полгода мы выпустили 500+ специалистов. Участники присоединились к командам финтех-разработки и разработки ИТ-продуктов. Выпускников также ждут в юнитах облачных сервисов, развития ИИ-решений, интеграции и консалтинга. Программа курса: spring framework; docker; синхронное и асинхронное взаимодействие, брокеры сообщений; паттерны, SOLID. ⌛️ Быстрое обучение: 1 месяц. 💻Гибкий формат: все этапы онлайн, занятия по вечерам. Готов прокачаться вместе с экспертами индустрии? Тогда подавай заявку до 22 августа! Старт интенсива — 28 августа. Реклама. ООО "Т1". ИНН 7720484492.

❓Что выведет код на изображении выше?
Anonymous voting

#test
#test

«Где Дата, Коль?». Первое реалити-шоу про дата-инженеров Новый проект учебного центра Слёрм и Николая Маркова, Data Platform Lead в компании Altenar. 👀 Мы выбрали 5 участников, чтобы 14 недель подряд наблюдать, как они проходят наш курс «Data-инженер». И отлично справляются, набирая баллы, или лажают, пропуская дедлайны 🙂 Чтобы дойти до финала, участники должны освоить Python, MapReduce и ETL-инструменты, разобраться с Hadoop, NOSQL, Airflow, Kafka, аналитикой и архитектурой хранилищ данных. Каждые две недели выходит новая серия. Ментор и ревьюеры разбирают сделанные домашки участников, комментируют результаты и обновляют турнирную таблицу. ❗️Главное правило: Кто перестаёт учиться — выбывает из проекта. Никаких исключений! Кто справится со всеми заданиями вовремя? Кому ревьюер выставит самый высокий балл? Кто вылетит? А кто получит главный приз? Ответы на эти вопросы, новости с шоу, а также статьи, кейсы и best practices для начинающего дата-инженера — в канале проекта: 👉 @gdedata Подписывайтесь! Реклама. ИП Аердинов Н.В. ИНН 638103515932 erid: LjN8K97oM

👆👆не получилось в рамках одного поста описать такие возможности redisTemplate как работу со списками (leftPush, leftPop, range) и redis-каналы. Может еще напишу отдельный пост про это

✅ RedisTemplate В продолжение предыдущей статьи хочу рассказать про другой способ работы с Redis. RedisTemplate - это низкоур
RedisTemplate В продолжение предыдущей статьи хочу рассказать про другой способ работы с Redis. RedisTemplate - это низкоуровневый инструмент, который предоставляет мощный и гибкий API для взаимодействия с Redis. Он позволяет выполнять практически любые операции с Redis, такие как чтение, запись, удаление и выполнение сложных команд. Для начала необходимо определить бин RedisTemplate:
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
При определении RedisTemplate важно указать подключение к Redis используя RedisConnectionFactory. При необходимости можно указать дополнительные параметры конфигурации RedisTemplate: ▫️template.setKeySerializer(serializer) - сериализатор для ключей ▫️template.setValueSerializer(serializer) - сериализатор для значений ▫️template.setEnableTransactionSupport(true) - включение поддержки транзакций Для RedisTemplate есть набор базовых сериализаторов: ▫️JdkSerializationRedisSerializer ▫️StringRedisSerializer ▫️Jackson2JsonRedisSerializer ▫️GenericToStringSerializer RedisTemplate предоставляет методы для получения операций, с помощью которых можно взаимодействовать с хранимыми в Redis значениями: ▫️redisTemplate.opsForValue() - примитивные значения ▫️redisTemplate.opsForHash() - хеш значения ▫️redisTemplate.opsForList() - списки ▫️redisTemplate.opsForStream() - стримы Для примера рассмотрим запись и получение строкового значение:
redisTemplate.opsForValue().set("name", "Ivan");
redisTemplate.opsForValue().set("age", 18);
redisTemplate.opsForValue().increment("age");
redisTemplate.expire("age", 10,TimeUnit.SECONDS);
String value = (String) redisTemplate.opsForValue().get("name");
В первых двух строках происходит запись значений в Redis. С помощью метода increment() увеличивается значение записанное с ключом age. Метод expire() устанавливает время жизни записи, через которое она будет автоматически удалена. Так как при конфигурации RedisTemplate мы указали что возвращаемое значение будет иметь тип Object, то необходимо преобразовывать полученные данные в нужный тип. 🫡 Секреты Java #java #spring #redis

⚡️ Google в России — ВСЁ! Блогеры переезжают в Telegram, а разработчики из Big Tech не остались в стороне и уже перенесли пла
⚡️ Google в России — ВСЁ! Блогеры переезжают в Telegram, а разработчики из Big Tech не остались в стороне и уже перенесли платные материалы в свои каналы: 📱 @java – разработка на Java 📱 @python – разработка на Python 📱 @frontend – всё о JavaScript, HTML и CSS 📱 @it_hub – полезные материалы для разработчиков 📱 @english – английский язык в IT-сфере 📱 @memes – юмор и мемы для программистов

❓Что выведет код на изображении выше?
Anonymous voting

#test
#test

✅ Redis Redis - одна из популярных NoSQL БД типа "ключ-значение". Данная БД хранит значения в оперативной памяти, так что она
Redis Redis - одна из популярных NoSQL БД типа "ключ-значение". Данная БД хранит значения в оперативной памяти, так что она не подходит для постоянного хранилища. Но из за этой особенности скорость записи/чтения гораздо выше чем у обычных SQL БД, поэтому Redis часто используется как кэш для основной базы данных. Redis поддерживает такие типы данных: ▫️Строка ▫️Хеш-таблица ▫️Список ▫️Множество ▫️Отсортированное множество Redis хранит числовые данные в виде строк, но при этом позволяет выполнять инкремент и декремент таких значений. Spring предоставляет простую интеграцию с Redis. Для использования Redis нужно указать следующую зависимость:
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
Параметры подключения можно указать в файле конфигурации application.yml:
spring:
  data:
    redis:
      host: localhost
      port: 6379
Либо использовать для этой цели бин RedisStandaloneConfiguration:
    @Bean
    public RedisStandaloneConfiguration redisStandaloneConfiguration() {
        RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration();
        redisConfig.setHostName("localhost");
        redisConfig.setPort(6379);
        return redisConfig;
    }
Создание сущностей и репозиториев для Redis не сильно отличается от работы с JPA.
@RedisHash("person")
public class Person {
    @Id
    private String id;
    private String name;
    private Integer age;
    ...
}
Аннотация @RedisHash используется для указания класса, который будет использоваться для хранения в Reddis.
public interface PersonRepository extends CrudRepository<Person, String> {
}
Так же репозиторий для Redis может расширять интерфейс KeyValueRepository, который создан для работы с данными в виде пар ключ-значение. Если вы хотите использовать такие особенности Redis как время жизни записи, инкремент/декремент числовых значений, Redis-каналы, то для этого в Spring есть RedisTemplate, о котором будет рассказано в следующих статьях. 🫡 Секреты Java #java #spring #redis

Рекомендуем канал Java | Фишки и трюки! ⌨️ Ответы на вопросы с собеседований ⌨️ Разбор полезных классов и методов ⌨️ Заковыри
Рекомендуем канал Java | Фишки и трюки! ⌨️ Ответы на вопросы с собеседований ⌨️ Разбор полезных классов и методов ⌨️ Заковыристые тесты на знание Java ⌨️ Полезные Java либы и фреймворки И многое другое! 👉 Присоединиться

✅ Требования ACID к БД Если вы когда-нибудь работали с базами данных, то наверняка слышали термин "ACID". Это важнейшее понят
Требования ACID к БД Если вы когда-нибудь работали с базами данных, то наверняка слышали термин "ACID". Это важнейшее понятие в мире реляционных баз данных, обеспечивающее надежность и согласованность данных. ACID — это аббревиатура, которая расшифровывается как: ▫️Atomicity (Атомарность): Все операции внутри транзакции выполняются как единое целое. Либо все изменения успешно фиксируются, либо не фиксируется ничего. Это защищает ваши данные от частичных изменений, которые могут привести к неконсистентности. ▫️ Consistency (Согласованность): После выполнения транзакции база данных переходит из одного согласованного состояния в другое. Это гарантирует, что все правила, ограничения и зависимости остаются в силе. ▫️ Isolation (Изолированность): Транзакции выполняются независимо друг от друга. Временные изменения в одной транзакции не должны быть видны другим до её завершения. Это предотвращает "грязные" чтения и обеспечивает предсказуемость работы. ▫️ Durability (Долговечность): После завершения транзакции её изменения сохраняются навсегда, даже в случае сбоя системы. Это гарантирует, что ваши данные останутся целыми и невредимыми. ACID предоставляет гарантию, что ваши данные всегда будут находиться в согласованном и надежном состоянии. Это критически важно для приложений, где каждая операция должна быть точной и надежной, например, в банковских системах, коммерции или любой другой сфере, где ошибки с данными недопустимы. 🫡 Секреты Java #sql #acid

❓Что выведет код на изображении выше?
Anonymous voting

#test
#test