2021-03-01 Дневник интервью по Java Advanced Development

Java
2021-03-01 Дневник интервью по Java Advanced Development

предисловие

Хорошие братья, в этой статье записаны относительно сложные вопросы для собеседования, которые Ань Цзян брал на собеседовании для публичной компании электронной коммерции в Гуанчжоу. Т.к. Ан Соус действительно не рассматривала эту часть, поэтому ответила грубо (одиноко). Не знаю, из-за паблика ли это, там нет такой проблемы, как высокий параллелизм, но есть вопросы, связанные с многопоточностью. Вопросы интервью следующие, и ответы были добавлены.

02.03.2021 HR другой стороны сообщил результат, что собеседование было пройдено, но выданная зарплата не оправдала моих ожиданий и была отклонена.... Может быть, это начало того, что я становлюсь хулиганом? ?

Как обеспечить последовательное потребление MQ

Так как Ан соус упомянул знакомых в своем резюмеMQдаRabbitMQа такжеRocketMQ, так что дваMQанализировать волну.

Гарантированное последовательное потребление в RabbitMQ

потому чтоRabbitMQСам по себе он не поддерживает последовательное потребление, поэтому, когда очередь имеет несколько потребителей, может возникнуть путаница в потреблении.

решение

Сначала выбирается, когда производитель отправляет сообщениеMQРежим отправки точка-точка означает, что очередь соответствует потребителю, а затем все сообщения, которые должны быть гарантированно упорядочены, отправляются в очередь.

Потребители должны закрытьсяAutoack, и воляprefetchCountУстановите на один, получайте только одно сообщение за раз, выполняйте подтверждение вручную после обработки, а затем получайте следующее сообщение. Поскольку имеется только один потребитель, это обеспечивает последовательное потребление.

Гарантированное последовательное потребление в RocketMQ

потому чтоRocketMQПоддерживает последовательное потребление, вот цитата с официального сайта.

Порядок сообщений означает, что сообщения могут потребляться в том порядке, в котором они были отправлены (FIFO).RocketMQПорядок сообщений может быть строго гарантирован, и его можно разделить на порядок разделов или глобальный порядок. Анализ принципа последовательного потребления.По умолчанию отправка сообщения будет заниматьRound RobinМетод опроса отправляет сообщения на разныеqueue(разделенная очередь); при потреблении сообщений из несколькихqueueВытягивание сообщений, в этом случае порядок отправки и потребления не гарантируется. Но если последовательные сообщения, отправляемые системой управления, посылаются только последовательно одному и тому жеqueue, при потреблении только из этогоqueueТяните их последовательно, тогда порядок гарантирован. При отправке и использовании участвующихqueueЕсть только один, он глобально упорядочен; если их несколькоqueueУчастие, разбиение упорядочено, т. е. относительно каждогоqueue, сообщения упорядочены.

Так как же производитель гарантирует, что сообщения могут быть отправлены в очередь по порядку? можно использоватьHashАлгоритм по модулю, например, тот же заказ отправляется в ту же очередь после прохождения алгоритма, а затем синхронно отправляется, успешно отправляется только сообщение о создании того же заказа, а затем отправляется сообщение об оплате. Таким образом, мы гарантируем упорядоченную доставку.

Слова потребителя в основном для достиженияMessageListenerOrderlyинтерфейс и установитьConsumerПервый запуск - начать потребление с головы или хвоста очереди, если это не первый запуск, то продолжить потребление по позиции последнего потребления (consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET)).

Кратко расскажите о процессе MySQL, выполняющем оператор SQL.

Это все еще очень сложно, поэтому давайте не будем усложнять. Возьмем в качестве примера оператор запроса, который немного отличается от оператора new, как показано на следующем рисунке.mysql 执行

Соединитель

в запросеSQLПеред утверждением необходимо сначала установитьMySQLподключение, которое осуществляется разъемом. Коннектор отвечает за установление соединения с клиентом, получение разрешений, поддержку и управление соединением.

кэш запросов

После установления соединения начинается выполнениеselectоператор, кеш будет опрошен перед выполнением.

MySQLПосле получения запроса запроса он сначала запросит кеш, чтобы увидеть, был ли выполнен этот оператор. Выполненные операторы и их результаты представлены в видеkey-valueФорма пары хранится в определенной области памяти.keyэто оператор запроса,valueявляется результатом запроса. Если ваш запрос можно найти прямо в этом кешеkey, то этоvalueбудут возвращены непосредственно клиенту.

Если оператора нет в кэше запросов, он перейдет к следующему этапу выполнения. После завершения выполнения результат выполнения будет сохранен в кэше запросов. Если запрос попадает в кеш,MySQLВы можете напрямую вернуть результат без выполнения следующих сложных операций, что повысит эффективность.

Анализатор

Если кеш запроса отсутствует, пора начинать выполнение оператора. первый,MySQLнужноSQLПредложения разбираются.

Сначала анализатор выполнит лексический анализ.SQLОператоры состоят из нескольких строк и пробелов,MySQLВам нужно определить, что представляют собой строки внутри и что они представляют. MySQL из вашего вводаselectИдентифицируется это ключевое слово, которое является оператором запроса. Он также принимает строкуuser_infoРаспознается как имя таблицы, строкаidРаспознаются как имена столбцов. Затем нам нужно сделать грамматический разбор. По результату лексического анализа синтаксический анализатор будет оценивать ввод в соответствии с правилами грамматики.SQLУдовлетворено ли заявлениеMySQLграмматика.

оптимизатор

После лексического разбора и синтаксического анализа анализатора он также обрабатывается оптимизатором.

Оптимизатор решает, какой индекс использовать, когда в таблице есть несколько индексов или когда оператор связан с несколькими таблицами (join), определите порядок соединения каждой таблицы.

Актуатор

MySQLЗная, что делать через анализатор, и зная, как это сделать через оптимизатор, он входит в фазу исполнителя и начинает выполнять оператор.

Когда вы начнете выполнять, вы должны сначала оценить свое понимание этой таблицыuser_infoЕсть ли разрешение на выполнение запроса, если нет, будет возвращена ошибка отсутствия разрешения. Если у вас есть разрешение, откройте таблицу, чтобы продолжить выполнение. Когда таблица открыта, исполнитель вызовет соответствующий интерфейс чтения соответствующего механизма в соответствии с определением механизма таблицы.

Базовая структура данных Redis String

RedisиспользуетсяCязык, но дляRedisстрока, но неCСтрока на языке (т.е. с нулевым символом\0конечный массив символов).

используетсяSDS(Простая динамическая строка), формат данных показан ниже.
图片来源Redis设计与实现

  1. freeзаписаноbufКоличество неиспользуемых байтов в массиве.
  2. lenсохраненSDSСодержит длину строки.
  3. buf[]Массивы используются для хранения каждого элемента строки.

преимущество

использоватьSDSПреимущества заключаются в следующем:

Постоянная сложность для получения длины строки

потому чтоlenсуществование свойства, мы получаемSDSДлину строки нужно только прочитатьlenсвойства, временная сложностьO(1). И дляCЯзык, длина строки обычно достигается путем обхода счетчика, а временная сложность равнаO(n). пройти черезstrlen keyкоманда, чтобы получитьkeyдлина строки.

Избегайте переполнения буфера

мы знаем этоCиспользуемый языкstrcatдля объединения двух строк, если не будет выделено достаточно места в памяти, это вызовет переполнение буфера. И дляSDSТип данных, при изменении символов он сначала будет основываться на записанномlenАтрибут проверяет, соответствует ли объем памяти требованиям, если нет, то будет произведено соответствующее расширение пространства, а затем будет выполнена операция модификации, чтобы не было переполнения буфера.

Уменьшите количество перераспределений памяти, которые изменяют строки

CПоскольку язык не записывает длину строки, если вы хотите изменить строку, вы должны перераспределить память (сначала освободить, а затем применить), потому что, если нет перераспределения, когда длина строки увеличивается, она будет вызовет переполнение буфера памяти, и длина строки переполнится, а при уменьшении вызовет утечку памяти.

И дляSDS,так какlenсвойства иfreeналичие атрибута для изменения строкиSDSРеализованы две стратегии предварительного выделения пространства и отложенного освобождения пространства:

1. Предварительное выделение пространства: при расширении пространства строки расширенная память превышает фактическую потребность, что может уменьшить количество перераспределений памяти, необходимых для операций непрерывного роста строки.

2. Ленивое освобождение места: при сокращении строки программа не сразу использует перераспределение памяти, чтобы вернуть лишние байты после сокращения, а используетfreeСвойство записывает количество этих байтов для последующего использования. (КонечноSDSтакже предоставляет соответствующиеAPI, мы также можем вручную освободить эти неиспользуемые пространства, когда они нам понадобятся. )

бинарный сейф

потому чтоCСтрока помечается нулевым символом в конце строки, а для некоторых двоичных файлов (таких как изображения и т. д.) содержимое может включать пустую строку, поэтомуCДоступ к строке невозможен, и всеSDSизAPIобрабатываются в двоичном форматеbufэлемент внутри иSDSВместо того, чтобы использовать пустую строку, чтобы определить, следует ли заканчивать,lenДлина атрибута для определения того, заканчивается ли строка.

Совместимость с некоторыми строковыми функциями C

несмотря на то чтоSDSявляется двоично-безопасным, но по-прежнему следует соглашению о том, что каждая строка завершается нулем, чтобы ее можно было использовать повторно.Cязыковая библиотека<string.h>некоторые функции в .

Кратко опишите характеристики микросервисов

Единая ответственность, независимость команды, независимость от технологий, разделение клиентской и серверной части, разделение базы данных, независимое развертывание, управление услугами

Разница и принцип ${} и #{} в mybatis

#{}является заполнителем параметра, маркером параметра в подготовленном операторе JDBC.

${}Просто замена строки, замена переменных будет выполняться на этапе динамического анализа SQL.

Отличие в том, что при настройке параметров#{}Он заменяет параметры в виде строк (с двойными кавычками). а также${}Просто замените значение параметра на переменную, тогда оно появитсяSqlпроблема с впрыском.