Галерея диаграмм связей Базовое резюме Java, веб-фреймворк, распределенная архитектура, структура и алгоритм данных, а также основные знания (распределенные, большие данные, микросервисы)
Базовые знания Java, знания J2EE, веб-фреймворк Java, знания многопоточности Java, основные идеи Java, RPC, распределенная архитектура, микросервисы, Hive больших данных, оптимизация Mysql, распределенные блокировки, балансировка нагрузки, структуры данных и алгоритмы и т. д., P7 Краткое изложение основных знаний уровня Java, суперрезюме.
Отредактировано в 2022-05-27 16:06:38A segunda unidade do Curso Obrigatório de Biologia resumiu e organizou os pontos de conhecimento, abrangendo todos os conteúdos básicos, o que é muito conveniente para todos aprenderem. Adequado para revisão e visualização de exames para melhorar a eficiência do aprendizado. Apresse-se e colete-o para aprender juntos!
Este é um mapa mental sobre Extração e corrosão de mim. O conteúdo principal inclui: Corrosão de metais, Extração de metais e a série de reatividade.
Este é um mapa mental sobre Reatividade de metais. O conteúdo principal inclui: Reações de deslocamento de metais, A série de reatividade de metais.
A segunda unidade do Curso Obrigatório de Biologia resumiu e organizou os pontos de conhecimento, abrangendo todos os conteúdos básicos, o que é muito conveniente para todos aprenderem. Adequado para revisão e visualização de exames para melhorar a eficiência do aprendizado. Apresse-se e colete-o para aprender juntos!
Este é um mapa mental sobre Extração e corrosão de mim. O conteúdo principal inclui: Corrosão de metais, Extração de metais e a série de reatividade.
Este é um mapa mental sobre Reatividade de metais. O conteúdo principal inclui: Reações de deslocamento de metais, A série de reatividade de metais.
Основы Java и базовые знания
основополагающие принципы
JVM (виртуальная машина Java)
принцип
Способ работы
Кроссплатформенный принцип
Как добиться независимости от платформы: скомпилировать один раз, запускать где угодно
время компиляции
директива компиляции javac
Инструкция по декомпиляции Javap
Исходный код Java сначала компилируется в байт-код, а затем анализируется JVM на разных платформах. Java не требует перекомпиляции при работе на разных платформах. Когда виртуальная машина Java выполняет байт-код, она преобразует байт-код в машинные инструкции конкретной платформы. на
Почему JVM не преобразует исходный код напрямую в машинный код для выполнения?
Подготовка: для каждого выполнения требуются различные проверки.
Совместимость: другие языки также можно разобрать в байт-код.
модель памяти
Схема модели памяти
эксклюзивный тред
счетчик команд
Небольшой объем памяти, который является индикатором номера строки байт-кода, выполняемого текущим потоком (инструкции байт-кода, ветвления, циклы, переходы, обработка исключений и другая информация).
Каждый поток должен иметь независимый счетчик программ. Этот тип памяти также называется «частной памятью потока».
Стек виртуальных машин Java
Приватный поток, метод при выполнении создаст структуру данных кадра стека.
В основном используется для хранения таблиц локальных переменных, стеков операций, динамических ссылок, экспорта методов и т. д.
При создании каждого потока JVM создаст для него соответствующий стек виртуальной машины.
Размер разделения памяти стека напрямую определяет, сколько потоков может создать процесс JVM.
Обмен темами
МетаПространство
Разница между MetaSpace и постоянной генерацией (до версии PermGen JDK7)
Метапространство использует локальную память, а постоянное поколение использует память JVM.
Преимущества MetaSpace по сравнению с PermGen
Пул строковых констант имеет постоянную генерацию, которая подвержена проблемам с производительностью и переполнению памяти.
Размер классов и методов определить сложно, что затрудняет определение размера постоянного поколения.
Постоянная генерация усложняет GC
Облегчает интеграцию HotSpot с другими JVM, такими как Jrockit.
Куча
Область размещения экземпляра объекта
Разница между кучей и стеком (стратегия распределения памяти)
Стратегия распределения памяти Java
статическое хранилище
Требования к пространству времени выполнения для каждого целевого объекта данных определяются во время компиляции.
стековое хранилище
Требования к области данных неизвестны во время компиляции и определяются перед входом в модуль во время выполнения.
Хранилище кучи
Его нельзя определить во время компиляции или перед запуском записи модуля, и он выделяется динамически.
Разница между кучей и стеком в модели памяти Java
Контакт: при ссылке на объект или массив переменная, определенная в стеке, сохраняет первый адрес цели в куче.
разница
стиль управления
стек автоматически освобождается
Для кучи требуется GC
размер помещения
Стек меньше кучи
Связанный с фрагментом
Фрагментация, создаваемая стеком, намного меньше, чем фрагментация кучи.
Распределение
Стек поддерживает статическое и динамическое размещение.
Куча поддерживает только динамическое распределение.
эффективность
Стек более эффективен, чем куча
область метода
До jdk1.8
ПермьГен
локальная память
jdk1.8
Мета Пространство
Механизм загрузки классов JVM
загрузчик классов
Запустить загрузчик классов
загрузчик классов расширений
Загрузчик приложения
Модель родительского делегирования
Процесс от компиляции класса до выполнения
Компилятор компилирует исходный файл .java в файл байт-кода .class.
ClassLoader преобразует файлы байт-кода .class в объекты Class<?> в JVM.
JVM использует объект Class<?> для создания его экземпляра?
Что такое ClassLoader
ClassLoader играет очень важную роль в Java. В основном он работает на этапе загрузки файла класса, и его основной принцип работы заключается в получении потока двоичных данных класса извне системы. Это основной компонент Java. Все файлы классов загружаются через ClassLoader. ClassLoader отвечает за загрузку потока двоичных данных из файла классов в систему, а затем передает его виртуальной машине Java для подключения, инициализации и других операций.
Типы ClassLoader (четыре типа)
Загрузчик классов Bootstrap
Написан на C, загружается основная библиотека Java.*
Эксткласслоадер
Написано на Java, загрузите библиотеку расширений javax.*
AppClassLoader
Написан на Java, каталог, в котором находится загрузчик
Пользовательский загрузчик классов
Написан на Java, индивидуальная загрузка.
ОСГИ (система динамического моделирования)
Сбор мусора (GC)
Тип ГХ
Второстепенный GC/Молодой GC
Основной GC/Полный GC
Полный сборщик мусора работает медленнее, чем основной сборщик мусора, но выполняется реже.
Запустить условие полного сбора мусора
Недостаточно места в старом поколении
Недостаточно места в постоянном поколении (до JDK7)
CMS GC показывает, что продвижение не удалось, сбой одновременного режима
Второстепенный GC перемещается в область, где средний размер старого поколения больше, чем оставшееся пространство старого поколения.
System.gc() явно вызывается в программе, чтобы напомнить JVM о необходимости переработки молодого и старого поколений.
Куча памяти
Молодое поколение
При создании объекта выделение памяти сначала происходит в молодом поколении.
Объекты перестают использоваться вскоре после их создания, и большинство из них быстро очищаются сборщиком мусора молодого поколения.
Старое поколение
Большие объекты можно создавать прямо в старом поколении
Если объект достаточно долго сохраняется в молодом поколении без очистки, он копируется в старое поколение.
Пространство у старшего поколения обычно больше, чем у молодого поколения, и в нем можно хранить больше предметов.
Когда в старом поколении недостаточно памяти, будет выполняться Full GC.
постоянное поколение
Относится к постоянной области хранения памяти, в которой в основном хранятся классы и метаданные.
Класс помещается в постоянную область при загрузке, и сборщик мусора не будет очищать постоянную область генерации.
Область постоянной генерации будет заполняться по мере увеличения количества загруженных классов, и в конечном итоге будет выдано исключение OOM (недостаточно памяти).
В Java 8 постоянное поколение было удалено и заменено областью, называемой «областью метаданных» (метапространством).
Метапространство не находится на виртуальной машине, а использует локальную память.
Принципиальная схема
логическая схема
Алгоритм переработки
Алгоритм маркировки и развертки
Сначала отметьте, затем удалите, не перемещая объект Преимущество в том, что он выполняется быстро Недостаток заключается в том, что это приведет к фрагментации памяти. Когда необходимо выделить большой объект, не удается найти достаточно большую непрерывную память, что приводит к срабатыванию другого GC.
Алгоритм репликации
Разделяется на поверхность объекта и свободную поверхность.
Объекты создаются на поверхности объекта.
После очистки уцелевшие объекты будут скопированы со стороны объекта на свободную сторону.
Очистить все объекты на поверхности объекта
Подходит для молодого поколения.
преимущество: 1. Решить проблему фрагментации 2. Распределяйте память последовательно, просто и эффективно. 3. Подходит для сценариев с низкой выживаемостью объектов.
недостаток
Вам нужно разделить его на части и скопировать.
Алгоритм сопоставления меток
Избегайте разрывов памяти
Нет необходимости настраивать два свопа
Подходит для сценариев с высокой выживаемостью объектов.
Подходит для пожилых людей
Алгоритм сбора поколений
Комбинация алгоритмов сборки мусора
В зависимости от разных жизненных циклов объектов для разделения разных областей используются разные алгоритмы сборки мусора.
Цель: повысить эффективность переработки JVM.
Решение о выживании объекта
подсчет ссылок
анализ доступности
Корни GC
Объекты, на которые ссылаются таблицы локальных переменных в стеке виртуальной машины.
в области метода
Объект, на который ссылается статическая переменная класса
объект, на который ссылается константа
Объекты, на которые ссылается JNI, в стеке локальных методов.
Что произойдет, если он недоступен?
финализировать()
Молодое поколение – собирайте предметы с коротким жизненным циклом как можно быстрее
Разделение пространства памяти Эдемский район Две зоны выжившего
Каждый раз используйте одну область Эдема и одну область Выжившего.
Каждый раз, когда запускается второстепенный GC, возраст увеличивается на 1.
Когда возраст по умолчанию равен 15 годам, объект перейдет в старое поколение.
Возраст старого поколения можно настроить с помощью -XX:MaxTenuringThreshold.
Если созданный объект относительно велик и не может быть размещен Энденом или Выжившим, он сразу войдет в старость.
Как продвигать объект старому поколению
Объекты, которые выживают после определенного количества миноров
Выживший Объект, который нельзя отпустить
Если область Эндена не может быть размещена, будет запущен MinorGC, и объекты в области Эдема будут очищены.
Вновь созданный большой объект управляет размером большого объекта с помощью -XX: PretenuerSizeThreshold.
Часто используемые параметры настройки
-XX: Коэффициент выживших
Соотношение площади Эдема к площади Выжившего, по умолчанию 8:1.
-XX:НовоеСоотношение
Соотношение объема памяти между старым и молодым поколением
-XX:MaxTenuringThreshold
Максимальный порог количества раз GC, когда объект переводится из молодого поколения в старое.
Сборщик мусора нового поколения.
Остановить мир
JVM остановила выполнение программы из-за выполнения GC.
Происходит в любом алгоритме GC
Большинство оптимизаций GC улучшают производительность программы за счет сокращения времени, в течение которого происходит остановка мира.
Точка безопасности
Точки, в которых отношения ссылок на объекты не изменятся в процессе анализа.
Где генерируется точка сохранения: вызов метода, выход из цикла, переход к исключению и т. д.
Выберите безопасную точку соответствующим образом. Выбор слишком малого числа приведет к слишком длительному времени ожидания ГХ. Выбор слишком большого количества приведет к увеличению нагрузки на работающую программу.
Режим работы JVM
Сервер
Тяжеловесная виртуальная машина внесла в программу дополнительные оптимизации. Запускается медленнее, работает быстрее
Клиент
Легкий, быстро запускается, медленно работает
Распространенные сборщики мусора среди молодого поколения
Отношения между сборщиками мусора
Между сборщиками мусора существует связь, указывающая на то, что их можно использовать вместе.
Последовательный сборщик (-XX:UseSerialGC, алгоритм копирования)
Однопоточная сборка, при выполнении сборки мусора все рабочие потоки должны быть приостановлены.
Простой и эффективный сборщик молодого поколения по умолчанию в режиме клиента.
Сборщик ParNew (-XX: UseParNewGC, алгоритм копирования)
Многопоточный сбор, другие варианты поведения и характеристики такие же, как у последовательного сборщика.
Эффективность одноядерного выполнения не так хороша, как последовательная, и она имеет преимущества только при выполнении на нескольких ядрах.
Сборщик параллельной очистки (-XX:UseParallelGC, алгоритм копирования)
Сначала поймите, что пропускная способность = время выполнения пользовательского кода / (время выполнения пользовательского кода)
Вместо того, чтобы обращать внимание на время паузы пользовательского потока, обратите больше внимания на пропускную способность системы.
Выгодно выполнять под многоядерным процессором, сборщиком молодого поколения по умолчанию в режиме Сервера.
Политика адаптивной настройки (-XX:UseAdaptiveSizePolicy)
Оставьте задачу настройки памяти виртуальной машине для завершения
Сборщик мусора старого поколения
Сборщик Serial Old (-XX:UseSerialOldGC, алгоритм сопоставления меток)
Многопоточность, прежде всего пропускная способность
Сборщик SMS (-XX: UseConcMarkSweepGC, алгоритм проверки меток)
Поток сборки мусора может работать почти одновременно с рабочим потоком, почти, не полностью, максимально сокращая время паузы
Тег инициализации: Остановить мир
Требует небольшой паузы
Метка параллелизма: маркировка параллельной трассировки, программа не будет приостанавливаться.
Предварительная очистка параллелизма: найдите объекты, переведенные из молодого поколения в старое на этапе одновременной маркировки.
Примечание. Приостановите работу виртуальной машины и просканируйте кучу CMS на наличие оставшихся объектов.
Требует небольшой паузы
Параллельная очистка: поток сбора мусора выполняется одновременно с пользовательским потоком для очистки помеченного мусора.
Очистите мусорные объекты и программа не будет останавливаться.
Сброс параллелизма: сброс структуры данных сборщика CMS.
Процесс выполнения сборщика CMS
трехцветный метод маркировки
Если текущий узел и все его дочерние элементы завершили маркировку, текущий узел имеет черный цвет, если текущий узел завершил маркировку, а все дочерние узлы не завершили маркировку, текущий узел — серый, неотмеченные узлы — белые;
Может произойти неправильная маркировка или неправильная маркировка.
cms использует алгоритм инкрементального обновления
G1 использует SATB (снимок в начале), называемый моментальным снимком.
Сборщик G1 (сначала мусор) (-XX: UseG1GC, алгоритм сопоставления меток копирования)
Особенности сборщика мусора Garbage First
Параллелизм и параллелизм
Коллекция по поколениям
пространственная интеграция
предсказуемые паузы
Разделите всю память Java на несколько областей одинакового размера.
Молодое поколение и старое поколение больше не разделены физически.
Очень точно контролируйте время паузы, чтобы обеспечить сбор мусора с небольшими паузами без ущерба для пропускной способности.
Чтобы избежать полной сборки мусора, он делит память кучи на несколько независимых областей фиксированного размера и отслеживает ход сборки мусора в этих областях.
На основе алгоритма mark-compact не происходит фрагментации памяти.
#Изменяем сборщик мусора по умолчанию экспорт JAVA_OPTS='-XX: UseG1GC'
Новый сборщик мусора JDK11 Epsilon GC
Новый сборщик мусора ZGC в JDK11
Сборщик мусора Java: часто задаваемые вопросы
Является ли метод Finalize() объекта Object тем же, что и деструктор C?
В отличие от деструктора C, вызов которого детерминирован, его вызов не определен.
Поместите объекты, на которые нет ссылок, в очередь F-Queue.
Выполнение метода может быть прекращено в любой момент
Подарите эксклюзивный последний шанс на возрождение
Каковы функции сильных, мягких, слабых и виртуальных ссылок в Java?
Сильная ссылка
Самая распространенная ссылка: Object = new Object().
Если памяти недостаточно, для завершения программы будет выброшено сообщение OutOfMemoryError, а объекты с сильными ссылками не будут переработаны.
Ослабьте ссылку, установив для объекта значение null, чтобы его можно было переработать.
Мягкая ссылка
Объект находится в полезном, но ненужном состоянии
Только когда памяти недостаточно, сборщик мусора освободит память объекта, на который ссылается.
Может использоваться для реализации кэширования сообщений с учетом памяти.
String str = new String("abc");//сильная ссылка SfotReferenct<String> softRef = new SoftReference<String>(Str);//мягкая ссылка
Слабая ссылка
Несущественные объекты, слабее, чем мягкие ссылки.
Будет переработано во время GC
Вероятность повторного использования также мала, поскольку приоритет потока GC относительно низок.
Подходит для ссылок на объекты, которые используются время от времени и не влияют на сбор мусора.
String str = new String("abc");//сильная ссылка WeakReferenct<String>weakRef = new WeakReference<String>(Str);//Слабая ссылка
Фантомная ссылка
Не определяет жизненный цикл объекта
Может быть собран сборщиком мусора в любое время.
Отслеживайте активность объектов, перерабатываемых сборщиком мусора, выступающим в роли дозорного.
Должен использоваться вместе с очередью ссылок ReferenceQueue.
Строка str = новая строка («abc»); Очередь ReferenceQueue = новая ReferenceQueue(); PhantomReference ref = новая PhantomReference(str,queue);
Справочная очередь
Фактической структуры хранения не существует, а логика хранения опирается на отношения между внутренними узлами для выражения
Сохраняет связанные мягкие ссылки, слабые ссылки и виртуальные ссылки, которые обрабатываются сборщиком мусора.
JVM-блокировка
Классификация замков
синхронизированный
Класс реализации интерфейса Lock
модуль
JMM (режим памяти Java)
Восемь основных операций взаимодействия памяти
lock: действует на переменные в основной памяти, помечая переменную как эксклюзивную для потока.
разблокировка: переменная, которая действует в основной памяти. Освобождает переменную, находящуюся в заблокированном состоянии. Только освобожденная переменная может быть заблокирована другими потоками.
чтение: действует на переменные основной памяти. Он передает значение переменной из основной памяти в рабочую память потока для использования в последующих действиях загрузки.
load: переменная, которая действует в рабочей памяти. Она помещает операцию чтения из переменной основной памяти в рабочую память.
use (использование): действует на переменные в рабочей памяти. Он передает переменные в рабочей памяти механизму выполнения. Всякий раз, когда виртуальная машина встречает значение, которое необходимо использовать, будет использоваться эта инструкция.
присваивание (присваивание): действует на переменную в рабочей памяти. Оно помещает значение, полученное от механизма выполнения, в копию переменной в рабочей памяти.
хранилище (хранилище): действует на переменные в основной памяти. Оно переносит значение переменной из рабочей памяти в основную для последующего использования при записи.
write: действует на переменные в основной памяти. Он помещает значение переменной, полученной из рабочей памяти в результате операции сохранения, в переменную в основной памяти.
Восемь правил
1. Одна из операций чтения и загрузки, сохранения и записи не может появляться одна. Даже если вы используете чтение, вы должны загружать, а если вы используете хранилище, вы должны писать.
2. Потоку не разрешено отбрасывать свою последнюю операцию присваивания, то есть после изменения данных рабочей переменной должна быть проинформирована основная память (видимая)
3. Потоку не разрешено синхронизировать неназначенные данные из рабочей памяти обратно в основную.
4. Новая переменная должна быть создана в основной памяти, а рабочая память не может напрямую использовать неинициализированную переменную. То есть, прежде чем переменную можно будет использовать для операций использования или сохранения, она должна пройти операции присваивания и загрузки.
5. Только один поток может одновременно заблокировать переменную. После многократной блокировки вам необходимо выполнить такое же количество разблокировок, чтобы разблокировать.
6. Если над переменной выполняется операция блокировки, значение этой переменной во всей рабочей памяти будет очищено. Прежде чем механизм выполнения будет использовать эту переменную, ее необходимо перезагрузить или назначить для инициализации значения переменной.
7. Если переменная не заблокирована, ее нельзя разблокировать. Вы также не можете разблокировать переменную, заблокированную другим потоком.
8. Прежде чем разблокировать переменную, ее необходимо синхронизировать обратно с основной памятью.
Принципы ядра Linux
Linuxархитектура
Ядро, оболочка, файловая система и приложения. Ядро, оболочка и файловая система вместе образуют базовую структуру операционной системы.
файловая система Linux
оболочка Linux
Оболочка — это пользовательский интерфейс системы, предоставляющий пользователям интерфейс для взаимодействия с ядром. Он получает команды, введенные пользователем, и отправляет их ядру для выполнения. Это интерпретатор команд. Кроме того, язык программирования оболочки имеет многие характеристики обычных языков программирования. Программы оболочки, написанные на этом языке программирования, имеют тот же эффект, что и другие приложения.
1. Bourne Shell: разработан Bell Labs.
2. BASH: Это оболочка Bourne Again от GNU. Это оболочка по умолчанию в операционной системе GNU. Эту оболочку используют большинство дистрибутивов Linux.
3. Korn Shell: это развитие Bourne SHell, совместимое с Bourne Shell во многих аспектах.
4. C Shell: это BSD-версия SUN Company Shell.
ядро Linux
Ядро Linux — один из крупнейших проектов с открытым исходным кодом в мире. Ядро — это самый низкий уровень легко заменяемого программного обеспечения, которое взаимодействует с компьютерным оборудованием. Он отвечает за подключение всех приложений, работающих в «пользовательском режиме», к физическому оборудованию и позволяет процессам, называемым серверами, получать информацию друг от друга с помощью межпроцессного взаимодействия (IPC). Ядро является ядром операционной системы и выполняет множество основных функций. Оно отвечает за управление системными процессами, памятью, драйверами устройств, файлами и сетевыми системами, а также определяет производительность и стабильность системы. Ядро Linux состоит из следующих частей: управление памятью, управление процессами, драйверы устройств, файловая система и управление сетью.
Управление памятью
Управление процессом
Файловая система
драйвер устройства
Сетевой интерфейс (NET)
Пользовательский режим и режим ядра
Приложения не могут напрямую обращаться к аппаратным ресурсам, и им необходим доступ к аппаратным ресурсам через интерфейс, предоставляемый уровнем SCI ядра.
Сетевые принципы
Сетевой протокол
HTTP
Формат HTTP-запроса и ответа
Тип запроса
ПОЛУЧАТЬ
Как сделать запрос на получение
Запрос прямо из адресной строки браузера
Запросы, сделанные по гиперссылкам
метод формы формы="получить"
Характеристики запросов get
Запрошенные параметры вставляются непосредственно после URL-адреса. Формат вставки: url?key=value&key=value.
Поскольку параметры запроса размещаются после URL-адреса, объем данных, передаваемых всеми запросами, ограничен и обычно не превышает 4 КБ.
Поскольку параметры запроса размещаются сразу после URL-адреса, это относительно небезопасно.
ШИКАРНЫЙ
Как сделать шикарный запрос
форма метода метода="post"
Характеристики шикарных запросов
Параметры запроса помещаются в тело запроса.
Поскольку параметры запроса помещаются в тело запроса: объем запрашиваемых данных, как правило, не ограничен.
Поскольку параметры запроса помещаются в тело запроса: относительно безопасно.
Разница между запросами GET и POST
Уровень HTTP-сообщения
Запрос GET помещает информацию запроса в URL-адрес, а POST помещает содержимое запроса в тело сообщения.
уровень базы данных
GET-запросы идемпотентны и безопасны, POST — нет.
другие аспекты
GET можно кэшировать и хранить, а POST — нет.
HTTP-запрос
строка запроса
Заголовок запроса
Позволять
Какие методы запроса поддерживает сервер?
Длина контента
Длина тела запроса в байтах
Тип содержимого
MIME-тип
Кодирование контента
Установите тип кодировки, используемый данными
Срок действия истекает
Время истечения срока действия тела ответа, время по Гринвичу, указывающее время действия кэша.
Тело запроса
Состав HTTP-ответа
строка ответа строка запроса Информация о состоянии кода состояния протокола заголовок ответа заголовок запроса ключ:значение Передавать клиенту информацию на стороне сервера, например формат и кодировку ответа. тело ответа тело запроса Перенос html-данных ответа
Перенаправление и перенаправление HTTP
Редирект (переход на страницу)
Что такое перенаправление
Когда браузер запрашивает веб-сервер в первый раз, веб-сервер возвращает браузеру код состояния 302 и URL-адрес. Когда браузер получает код состояния 302 и следующий адрес, он немедленно отправляет на сервер еще один запрос. для адреса после 302. Повторный процесс ответа. 302 локация
ответ.sendRedirect("адрес")
Функции
По сути, это поведение браузера с двумя запросами и двумя ответами. Адрес в адресной строке изменится
Объекты запроса и ответа обоих запросов являются новыми.
Технология перенаправления может не только находить запросы внутри проекта, но и находить запросы за пределами проекта.
Вперед (переход на страницу)
Что такое переадресация
Когда браузер отправляет запрос к сервлету веб-сервера, сервлет передает незавершенную работу следующему сервлету для обработки.
Получить транспондер
RequestDispatcher DS=request.getRequestDispatcher("пересылаемый адрес")
Вперед
ds.forward(запрос,ответ)
Функции
По сути, это поведение на сервере с одним запросом и одним ответом. Адрес в адресной строке не изменится
Совместное использование объектов запроса и ответа
Переадресация может осуществляться только внутри проекта.
HTTP-кэширование и прокси-серверы
Механизм файлов cookie
Разница между файлами cookie и сеансом
Файл cookie — это специальная информация, отправляемая сервером клиенту и хранящаяся на клиенте в текстовой форме. Когда клиент сделает повторный запрос, файл cookie будет отправлен обратно. После того, как сервер получит его, он проанализирует файл cookie и сгенерирует контент, соответствующий клиенту.
Сессия — это серверный механизм, сохраняющий информацию на сервере. Анализируйте клиентские запросы и обрабатывайте идентификаторы сеансов, сохраняя информацию о состоянии по мере необходимости.
Сессия существует на сервере, а файлы cookie хранятся на клиенте. Сессия более безопасна, чем Cookie Если вы планируете снизить нагрузку на сервер, вам следует использовать файлы cookie.
Цифровая подпись и сертификация
Подписи и сертификаты
В HTTPS сервер использует закрытый ключ для подписи, а затем браузер использует открытый ключ сертификата для проверки.
Сначала сертификат должен быть проверен центром сертификации, а затем необходимо использовать открытый ключ для защиты симметричного ключа, сгенерированного клиентом.
цифровой сертификат SSL
Еще 3 важных атрибута: информация об организации, открытый ключ и срок действия.
Записывайте открытый ключ и информацию об организации в формате X.509.
OpenSSL
Надежный, полнофункциональный набор инструментов коммерческого уровня для протоколов Transport Layer Security (TLS) и Secure Sockets Layer (SSL).
Это также общая библиотека паролей для преобразования формата сертификата.
Этапы аутентификации
1) Аутентификация сертификата сервера (браузер сообщает симметричный ключ)
2) Шифрованная связь (сертификат не требуется)
HTTPS и SSL/TLS
SSL/TLS
HTTPS использует технологию SSL/TLS.
Его ядром является технология симметричного шифрования и асимметричного шифрования.
TLS построен на спецификации протокола SSL 3.0 и является последующей версией SSL 3.0.
SSL-технология
Технология обеспечения безопасности связи в режиме C/S, основанная на технологии цифровых сертификатов.
Может обеспечить защиту от несанкционированного доступа, зашифрованную связь, сжатую связь.
процесс общения
1) Клиент отправляет запрос на связь
Номер версии SSL, параметры шифрования, идентификатор сеанса
2) Сервер отвечает ответом
Номер версии SSL, параметры шифрования, идентификатор сеанса и другая информация. Сертификат открытого ключа.
3) Клиент использует открытый ключ ЦС для проверки сертификата открытого ключа сервера. Если сертификат сервера недействителен, выдается исключение, и сеансу отказывается продолжаться.
4) Клиент отправляет сеансовый ключ симметричного ключа сеанса на сервер.
5) Обе стороны используют сеансовый ключ для зашифрованной связи.
Шифрование
Симметричное шифрование
И шифрование, и дешифрование используют один и тот же ключ.
асимметричное шифрование
Ключ, используемый для шифрования, и ключ, используемый для дешифрования, различаются.
Хэш-алгоритм
Преобразование данных любой длины в значение фиксированной длины, алгоритм необратим.
цифровая подпись
Докажите, что сообщение или документ было выдано/подтверждено определенным лицом.
Процесс передачи данных HTTPS
Браузер отправляет на сервер информацию о поддерживаемом алгоритме шифрования.
Сервер выбирает набор алгоритмов шифрования, поддерживаемых браузером, и отправляет его обратно браузеру в виде сертификата.
Браузер проверяет действительность сертификата и отправляет зашифрованную информацию на сервер на основе открытого ключа сертификата.
Сервер использует закрытый ключ для расшифровки сообщения, проверки хеша и шифрования ответного сообщения обратно в браузер.
Браузер расшифровывает ответное сообщение, проверяет подлинность сообщения, а затем шифрует данные взаимодействия.
Разница между HTTP и HTTPS
HTTPS должен подать заявку на получение сертификата от центра сертификации, HTTP — нет.
Передача зашифрованного текста HTTPS, передача обычного текста HTTP
Методы подключения разные. HTTPS по умолчанию использует порт 443, а HTTP по умолчанию использует порт 80.
HTTPS = HTTP-шифрование, защита целостности аутентификации, более безопасный, чем HTTP.
Действительно ли HTTPS безопасен?
Браузер по умолчанию заполняет http://. Запрос необходимо перенаправить, и существует риск его перехвата.
Оптимизация HSTS (HTTP Strict Transport Security)
TCP
Протокол TCP и управление потоком
Модель TCP/IP включает сотни взаимосвязанных протоколов, таких как TCP, IP, UDP, Telnet, FTP и SMTP.
Среди них TCP и IP являются двумя наиболее часто используемыми базовыми протоколами.
Как обеспечить надежность протокола TCP
Разница между TCP и UDP
Введение в UDP
Структура сообщения UDP
Исходный порт
Порт назначения
Длина
Контрольная сумма
UDP-функции
не ориентированный на соединение
Не поддерживает состояние соединения и поддерживает отправку одной и той же информации нескольким клиентам.
Заголовок данных очень короткий, всего 8 байт, и дополнительные накладные расходы невелики.
Пропускная способность жестко ограничена скоростью генерации данных, скоростью передачи и производительностью машины.
Доставка с максимальной эффективностью, но без гарантии надежной доставки, без необходимости поддерживать сложные таблицы состояний каналов.
Пакетно-ориентированный, нет необходимости разделять или объединять пакеты, отправленные приложением.
Различия между TCP и UDP
ориентированный на соединение
TCP-ориентированный на соединение
UDP-пакетно-ориентированный
надежность
TCP обеспечивает надежность, трижды взмахнув рукой
UDP не гарантирует надежность данных
упорядоченность
TCP имеет порядковый номер, обеспечивающий упорядоченность передачи данных.
UDP не гарантирует
скорость
TCP проделал большую работу по обеспечению надежности и упорядоченности данных и т. д., поэтому он работает медленно.
UDP-блок
величина
TCP — тяжеловес
UDP легкий
Скользящее окно TCP
РТТ и РТО
РТТ
Время, необходимое для отправки пакета данных для получения подтверждения от другой стороны.
РТО
интервал повторной передачи
Разъем
Связь с TCP и HTTP
Протокол TCP/IP используется для передачи сокетов формата потока. TCP используется для обеспечения правильности данных. IP используется для управления тем, как данные достигают места назначения из источника.
Протокол HTTP основан на сокетах, ориентированных на соединение, поскольку данные должны быть точными.
Основной принцип реализации
Возвращаемым значением сокета в UNIX/Linux является дескриптор файла, а для передачи данных можно использовать обычные функции работы с файлами.
Windows рассматривает сокет как сетевое соединение и должна вызвать функцию передачи данных, специально разработанную для сокета.
тип
Интернет-розетка
Stream Sockets (сокеты потокового формата)
значение
Также называется «сокетом с установлением соединения», основанным на протоколе TCP.
Это надежный двусторонний поток данных, при котором данные без ошибок доходят до другого компьютера и могут быть отправлены повторно в случае повреждения или потери.
особенность
Данные не исчезнут во время переноса
Данные передаются последовательно
Отправка и получение данных не синхронны
Внутри сокета потокового формата имеется буфер (то есть массив символов), и данные, передаваемые сокетом, будут сохранены в буфере.
Принимающая сторона не обязательно считывает данные сразу после их получения. Принимающая сторона может прочитать их все сразу после заполнения буфера.
передача инфекции
TCP-сокет
Буфер существует независимо и автоматически генерируется при создании сокета.
Закрытие сокета также продолжит передачу данных, оставшихся в выходном буфере.
Закрытие сокета приведет к потере данных во входном буфере.
По умолчанию используется режим блокировки
Сокеты датаграмм (сокеты формата датаграмм)
значение
Также называется «сокетом без установления соединения», на основе протокола UDP.
Просто передайте данные без проверки данных. Если данные повреждены во время передачи или не доходят до другого компьютера, исправить это невозможно.
особенность
Акцент на быстрой передаче, а не на порядке передачи.
Переданные данные могут быть потеряны или повреждены.
Ограничить размер данных на одну передачу
Данные отправляются и принимаются синхронно
передача инфекции
Используйте протокол IP для маршрутизации и протокол UDP (протокол пользовательских дейтаграмм) для передачи данных.
Применение: голосовой видеочат QQ, прямая трансляция
Сравнивать
Передача сокетов без установления соединения эффективна, но ненадежна и сопряжена с риском потери пакетов и повреждения данных.
Подключенные розетки очень надежны и надежны, но эффективность передачи низкая и потребляет много ресурсов.
Сокет Unix (путь к локальному узлу)
Сокет X.25 (адрес CCITT X.25)
Процесс передачи данных
три рукопожатия
При использовании метода Connect() для установления соединения клиент и сервер отправят друг другу три пакета.
четыре рукопожатия
Для установления соединения требуется трехстороннее рукопожатие, а для отключения — четырехстороннее.
Неработающей ссылке
Для корректного завершения работы используйте функцию Shutdown().
Возможные проблемы
Закрепленный пакет данных
Старшие и младшие биты (с обратным порядком байтов и прямым порядком байтов)
Big Endian: старший байт хранится по младшему адресу (сначала старший байт).
Little Endian: старший байт хранится по старшему адресу (сначала младший байт).
Операционная система
Классификация
По данным реального времени
операционная система с разделением времени
не в реальном времени
операционная система реального времени
Мягкий режим реального времени
Принимайте случайные нарушения правил времени
тяжелое реальное время
Обработка должна завершиться в пределах строго определенных событий
другой
сетевая операционная система
Распределенная операционная система
операционная система персонального компьютера
Windows, MaxOS, Linux, UNIX
категория
Микроконтроллер
Однокристальный микрокомпьютер, также известный как микроконтроллер MCU.
Микрокомпьютер с центральным процессором, памятью, таймерами/счетчиками, различными интерфейсами ввода и вывода и т. д., все это интегрировано в интегральную микросхему.
Встроенная система
Компьютерная система, встроенная в механическую или электрическую систему, имеющая специализированные функции и вычислительные возможности в реальном времени.
Встроенная система, часто используемая для эффективного управления многими распространенными устройствами, обычно представляет собой законченное устройство, содержащее цифровое оборудование и механические компоненты.
Встроенный Linux
Это общее название типа встроенной операционной системы. Этот тип операционной системы основан на ядре Linux и предназначен для использования во встроенных устройствах.
По сути, это то же самое, что и система Linux, работающая на компьютере. В основном она использует планирование задач, управление памятью, абстракцию оборудования и другие функции ядра Linux.
ОСРВ (операционная система реального времени)
Также известная как операционная система реального времени, она работает последовательно, управляет системными ресурсами и обеспечивает согласованную основу для разработки приложений.
рамки программирования
Весеннее семейное ведро
Весенняя структура
Функции
Инверсия управления (IoC)
Внедрение зависимостей (DI)
Слабая связь за счет внедрения зависимостей и ориентации интерфейса.
Аспектно-ориентированный (АОП)
Декларативное программирование, основанное на аспектах и инерции
Сократите шаблонный код с помощью аспектов и шаблонов.
Сценарии применения
Аутентификация полномочий
Автоматическое кэширование
Обработка ошибок
отлаживать
бревно
дела
Бин-ориентированный (BOP)
Легкое и минимально интрузивное программирование на основе POJO.
Sping легок как по размеру, так и по стоимости. Полную структуру Sping можно использовать в файле размером всего более 1 МБ.
Накладные расходы на обработку, необходимые Spring, также незначительны.
Ненавязчивость: обычно объекты в приложениях Spring не зависят от конкретных классов Spring.
контейнер
вид с высокого уровня
Интерфейс контейнера
БинФабрика
Под ним понимается HashMap, Key — это BeanName, а Value — это экземпляр Bean.
Обычно предоставляются только две функции регистрации (put) и приобретения (get).
Поддерживает как одноэлементную модель, так и модель прототипа.
Контекст приложения
«Контекст приложения» представляет все функции всего большого контейнера.
Метод обновления определен для обновления всего контейнера, то есть перезагрузки/обновления всех компонентов.
рамка
Простые компоненты можно настроить и объединить в сложные приложения.
В Spring объекты приложения составляются декларативно, обычно в XML-файле.
Предоставляет множество базовых функций (управление транзакциями, интеграцию инфраструктуры персистентности и т. д.), оставляя разработку логики приложения разработчикам.
Общие модули
Весеннее ядро
Обеспечивает создание объектов-контейнеров IOC и обработку взаимосвязей зависимых объектов.
основной
МОК
Общие аннотации
Аннотации уровня класса
@Компонент
@Контроллер
@Услуга
@Репозиторий
@Конфигурация
@ComponentsScan
@Бин
@Объем
Аннотации уровня переменной метода
@Autowire
@Квалификатор
@Ресурс
@Ценить
@Кэшируемый
@CacheEvict
Три метода инъекции
внедрение конструктора
выгода
Убедитесь, что зависимости неизменяемы (заключительное ключевое слово)
Убедитесь, что зависимости не пусты (что избавляет нас от их проверки)
Убедитесь, что код, возвращаемый клиенту (вызывающему), находится в полностью инициализированном состоянии.
Избегайте циклических зависимостей
Улучшена возможность повторного использования кода.
Внедрение интерфейса
инъекция сеттера
АОП
Принцип реализации
динамический прокси
реализация JDK
Необходимо реализовать хотя бы один интерфейс
CGlib
ASM управляет реализацией байт-кода для создания подклассов целевого класса.
статический прокси
плетение во время компиляции
Класс загрузки ткачества
Ключевые слова
Точка присоединения
Пойнткат
Совет
Перед советом
После возвращения совета
После того, как бросил совет
После (наконец) совета
Вокруг советов
Введение
Целевой объект
АОП-прокси
Аспект
Ткачество
Метод реализации
аннотация
@AspectJ
@Pointcut
@До
@После
@Вокруг
Конфигурационный файл
Общие приложения
дела
бревно
Разрешения
Абстракция ресурсов
Проверка и преобразование данных
Язык выражений Spring
основной контейнер
БинФабрика
BeanFactory — это инфраструктура среды Spring, обращенная к самому Spring.
ApplicationContext предназначен для разработчиков, использующих среду Spring.
Интерфейс BeanDefinitionRegistry предоставляет метод ручной регистрации объектов BeanDefinition в контейнере.
Интерфейс каскадного IoC-контейнера «родитель-потомок» Дочерний контейнер может получить доступ к родительскому контейнеру через метод интерфейса.
AutowireCapableBeanFactory автоматическое подключение
SingletonBeanRegistry регистрирует одноэлементные компоненты во время выполнения.
Как реализуется инверсия управления IOC
Метод конфигурации XML
Метод аннотации
Автоматический метод сборки
Весенний веб-модуль
Обеспечивает поддержку Struts, Springmvc и поддерживает веб-разработку.
SpringMVC
Реализация аннотации для сервлета 3.0
Инициализация контейнера ServletContainerInitializer
Регистрация регистрации сервлета
ФильтрРегистрационный фильтр
Контекст сервлета
Производительность реального боя
На основе асинхронного Servlet3.0.
Callableasync
Отложенный результатasync
Весенний веб-MVC
Общие аннотации
Аннотации уровня класса
@EnableWebMvc
@SessionAttributes
Аннотации уровня переменной метода
@RequestBody
@ResponseBody
@RequestMapping
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@ModelAttribute
@RequestParam
@RequestHeader
@RestController
@PathVariable
@ControllerAdvice
@CookieValue
@CrossOrigin
@Действительный
@Проверено
@ExceptionHandler
основные компоненты
Диспетчерсервлет
ОбработчикСопоставление
ОбработчикАдаптер
ПросмотрРезолвер
···
Весенний веб-флюс
Основы реактора
Лямбда
Мононуклеоз
Поток
основной
Веб-аннотации MVC
Функциональная декларация
МаршрутФункция
Асинхронный неблокирующий
сцены, которые будут использоваться
доступ к данным
обработка транзакции
Шаблон JDBC
тест
модульный тест
Интеграционное тестирование
Весенние данные
JPA
Редис
МонгоБД
Коучбейс
Кассандра
ЭластичныйПоиск
Neo4j
…
Весенняя безопасность
ОАут2.0
КАС
ВЕБ-безопасность
Авторизовать
Аутентификация
шифрование
…
Весна АОП
Spring предоставляет аспектно-ориентированное программирование, которое может обеспечить управление транзакциями для определенного уровня, например добавление контроля транзакций на уровень сервиса.
Весенний ДАО
Предоставляет содержательную иерархию исключений для уровня абстракции JDBC DAO.
Весенний ОРМ
Подключен к нескольким платформам ORM, включая JDO, Hibernate и iBatis SQL Map.
Весна ДЖИ
Поддержка спецификаций разработки J2EE, включая корпоративные сервисы, такие как JNDl, EJB, электронные компоненты, функции интернационализации, проверки и планирования.
Весенний контекст
Это файл конфигурации, который предоставляет контекстную информацию для платформы Spring.
Весенняя сессия
Весенняя интеграция
Весенняя REST-документация
Весенний AMQP
FanoutExchange (публикация/подписка)
Тип обмена
Разветвление
Широковещательная рассылка, доставка сообщений во все очереди, привязанные к бирже.
Прямой
Направленное сообщение доставляется в очередь, соответствующую указанному ключу маршрутизации.
Тема
Подстановочный знак, передать сообщение в очередь, соответствующую шаблону маршрутизации (шаблону маршрутизации).
Заголовки
Используйте заголовки, чтобы решить, в какие очереди отправлять сообщения (это используется редко).
Доступ к данным
транзакции
Поддержка ДАО
JDBC
ОРМ
Маршалинг XML
Основная упаковка баночки
бобы
Базовая реализация Spring IOC, включая доступ к файлам конфигурации, создание bean-компонентов и управление ими и т. д.
контекст
Предоставляет расширенные услуги по основным функциям IOC, а также обеспечивает поддержку многих услуг уровня предприятия.
основной
Основной пакет инструментов Spring, другие пакеты зависят от этого пакета.
выражение
Язык выражений Spring
Инструмент
Прокси-интерфейс Spring к серверу
Орм
Интеграция сторонних реализаций ORM, таких как hibernate, ibatis, jdo и реализация Spring jpa.
Весенний веб-сокет
Обеспечить связь через Socket и функцию push на веб-стороне.
Весенний тест
Простая инкапсуляция тестовых сред, таких как JUNIT.
Общие аннотации
аннотации компонентов
Компонент @Component, нет четкой роли
@Service используется на уровне бизнес-логики (уровень обслуживания).
@Repository используется на уровне доступа к данным (уровень дао).
@Controller используется на уровне представления, объявление контроллера (C)
Класс конфигурации Java
@Configuration объявляет текущий класс как класс конфигурации, что эквивалентно конфигурации Spring в форме xml (в классе).
Аннотация @Bean находится в методе, объявляя, что возвращаемое значение текущего метода является компонентом, заменяя метод в xml (используемый в методе).
@ComponentScan используется для сканирования компонента, что эквивалентно (по классу) в xml.
@WishlyConfiguration — это объединенная аннотация @Configuration и @ComponentScan, которая может заменить эти две аннотации.
Связанный с аспектом (AOP)
@Aspect объявляет аспект (в классе)
@After выполняется после выполнения метода (в методе)
@Before выполняется до выполнения метода (в методе)
@Around выполняется до и после выполнения метода (в методе)
@PointCut объявляет точечные разрезы
@Включить аннотацию
@EnableAspectJAutoProxy
Включить поддержку Spring для прокси AspectJ (в классах)
@EnableAsync включает поддержку асинхронных методов.
@EnableScheduling включает поддержку запланированных задач.
@EnableWebMvc включает поддержку конфигурации Web MVC.
@EnableConfigurationProperties включает поддержку bean-компонентов конфигурации аннотаций @ConfigurationProperties.
@EnableJpaRepositories включает поддержку репозитория SpringData JPA.
@EnableTransactionManagement включает поддержку аннотированных транзакций.
@EnableTransactionManagement включает поддержку аннотированных транзакций.
@EnableCaching включает поддержку кэширования аннотаций.
Весенняя панорама
SpringBoot
Содержит модули
Одно приложение
встроенный контейнер
Управление зависимостями
Соглашение важнее конфигурации
управление окружением
Управление журналами
Управление конфигурацией
автоматическая конфигурация
Функции управления
точка останова
РБИ
монитор
Инструменты разработчика и интерфейс командной строки
Общие аннотации
Аннотации уровня класса
@SpringBootApplication
@RestController
@EnableAutoConfiguration
@EntityScan
Аннотации уровня переменной метода
Три основные характеристики
Автоматическая сборка компонентов
вебMVC
Поддерживаемые механизмы шаблонов
FreeMarker
классный
Тимелиф
Усы
ДСП
webFlux
Поддерживаемые механизмы шаблонов
FreeMarker
Тимелиф
Усы
JDBC
···
Встроенный веб-контейнер (нет необходимости развертывать файлы War)
Кот
Пристань
Отлив
Особенности готовности производства
Предоставление надежных начальных зависимостей для упрощения настройки сборки.
Предоставить эксплуатационные характеристики
медицинское обследование
Информация об индикаторе
Внешняя конфигурация
Не требуется генерация кода, не требуется настройка XML
автоматическая сборка
Выполнение
Активируйте автоподключение — @EnableAutoConfiguration/@SpringBootApplication.
Реализация автоматической сборки-XXXAutoConfiguration
Настройка реализации автоматической сборки-META-INFO/spring.factories
точка расширения
SpringПриложение
Автоконфигурация
Диагностический анализатор
Встроенный контейнер
Механизм загрузки заводов
Источники конфигурации (источники свойств)
Конечные точки
Мониторинг и управление (JMX)
Событие/прослушиватель
ВеснаОблако
Общие компоненты
Весеннее облако GateWay
сервисный шлюз
весна-облако-стартер-шлюз
Маршрут
Предикат
Фильтр
Конфигурация весеннего облака
Конфигурация сервиса
Конфигурационный сервер
весна-облако-конфигурация-сервер
@EnableConfigServer
Клиент
весна-облако-стартер-конфигурация
Консул весенних облаков
Регистрация услуги/настройка услуги
Весенний облачный поток
управляемый событиями
Источник
Раковина
Процессор
Связующие
кролик-связчик весенних облаков
весна-облако-связующее-Кафка
весна-облако-связующее-кафка-потоки
(Функции и сервисы) Функция Spring Cloud
Функция
Потребитель
Поставщик
Приложения
весна-облако-функция-web
весна-облако-функция-поток
Весенняя облачная безопасность
Безопасность сервиса
Весенний Облачный Сыщик
Отслеживание и визуализация цепочки вызовов службы с помощью Zipkin
клиент
весеннее облако-стартер-сыщик
весеннее облако-стартер-зипкин
Зипкин Сервер
io.zipkin.java.zipkin-сервер
@EnableZipkinServer
Весеннее облако OpenFeign
Для Restful вызовов между службами (клиент REST)
весна-облако-стартер-openfegin
@EnableFeginClient
Весеннее облако Netflix
Управление услугами
Обнаружение службы Эврика
Обслуживание клиентов)
весна-облако-стартер-netflix-эврика-клиент
@EnableEurekaClient
ЭврикаСервер
весна-облако-стартер-netflix-эврика-сервер
@EnableEurekasServer
Предохранитель Hystrix
Клиент
весна-облако-стартер-netflix-hystrix-клиент
@EnableCircuitBreaker
Сервис агрегатирования турбин
весна-облако-стартер-netflix-турбина
@EnableTurbine
Серверная часть DashBoard
весеннее облако-стартер-netflix-hystrix-приборная панель
@EnableHystrixDashboard
Служба шлюза Zuul
Весеннее облако-стартер-netflix-zuul
@EnableZuulProxy > @EnableZuulServer
Сервис SideCar
весна-облако-стартер-netflix-коляска
@EnableSidecar
Балансировка нагрузки клиента Ribbion
весна-облако-стартер-netflix-ribbion
правила загрузки
Случайные правила
Наиболее доступные правила
Правила ротации тренировок
Повторить попытку реализации
Конфигурация клиента
Правила фильтрации доступности
Правила веса RT
Обход региональных правил
(Среда задач) Задача Spring Cloud
весна-облако-стартер-задача
@EnableTask
(Шина сообщений) Spring Cloud Bus
весна-облако-стартер-автобус-amqp
весна-облако-стартер-автобус-Кафка
Весенний облачный выключатель
Отказоустойчивость сервиса
(Консоль администратора) Spring Cloud Admin
de.codecentric.spring-boot-admin-starter-server
@EnableAdminServer
Поток данных Spring Cloud
Панель приборов
Приложение
Стартеры приложений Spring Cloud Stream
Стартеры приложений Spring Cloud Task
Сервер
Развертыватель
(Контракт на микросервис) Контракт Spring Cloud
Spring-Cloud-Starter-Контракт-Проверщик
весна-облако-стартер-контракт-заглушка-бегун
ORM-фреймворк
JDBC
Тип драйвера базы данных
Мост JDBC-ODBC
Собственный драйвер API Java
Сетевой чистый Java-драйвер JDBC
Драйвер Java на основе собственного протокола
МойБатис
определение
Отличная структура уровня персистентности, которая поддерживает настраиваемый SQL, хранимые процедуры и расширенное сопоставление.
Позволяет избежать почти всего кода JDBC, ручной настройки параметров и получения наборов результатов.
Схема архитектуры
использовать
Два метода настройки sql
Метод конфигурации XML
Метод аннотации аннотации
конфигурация настраивает каждый элемент
характеристики
параметр
typeПсевдонимы
типОбработчики
объектФабрика
плагины
окружающая среда
поставщик базы данных
картограф
Пагинация
страницаПомощник
Пакетная операция
Запрос на объединение
Возможные подводные камни
Соответствие jdbcType и типа поля базы данных
Спящий режим (Спящий режим)
Может использоваться в клиентских программах Java.
Может использоваться в веб-приложениях Servlet/JSP.
Платформа Hibernate может заменить CMP в архитектуре Java EE с применением EJB
SpringData
Весенние данные JDBC
Весенние данные JPA
генерация SQL
Соединить sql по имени метода
Запросить
находить
читать
получать
запрос
транслировать
Первый
Вершина
считать
существует
Отчетливый
Сортировать по
удалить
удалять
удалить
другой
Есть между/между
IsNotNull/NotNull
Иснулл/Нуль
IsLessThan/МеньшеЧан
IsLessThanEqual/МеньшеThanEqual
IsGreaterThan/GreaterThan
IsGreaterThanEqual/GreaterThanEqual
ИсБефор/Прежде
IsAfter/После
IsNotLike/Не нравится
Нравится/Мне нравится
IsStartingWith/StartingWith/StartsWith
IsEndingWith/EndingWith/EndsWith
Иснотпустой/нотпустой
IsEmpty/Пусто
IsNotContaining/NotContaining/NotContains
IsContaining/Содержит/Содержит
НетВ/НеВ
IsIn/Вход
Рядом/Рядом
Есть внутри/внутри
СовпаденияRegex/Совпадения/Регулярное выражение
Истина/Истина
Исложно/ложь
Нет/Нет
Есть/Равно
@Запрос
JPQL
Собственный SQL
Программный
JPA поставляется с часто используемыми API.
JpaRepository<T, ID>
найти все
найтиAllById
сохранить все
сохранитьAndFlush
удалитьInBatch
удалитьAllInBatch
получить один
Репозиторий PagingAndSorting<T, ID>
найти все
CrudRepository<T, ID>
сохранять
сохранить все
найти все
findById
существует по идентификатору
считать
удалить по идентификатору
удалить
удалить все
другой
румянец
Весенние данные Mongodb
Весенние данные Redis
Spring Data Elasticsearch
Spring Data Apache Solr
Spring данные Apache Hadoop
другой
ЗатмениеСсылка
иБАТИС
Предшественник MyBatis
JФинал
Морфия
Платформа разработки JavaWeb
веб-фреймворк
Нетти
Это сетевая платформа NIO для эффективной разработки сетевых приложений.
Модель резьбы
Схема архитектуры
Отличия от Томкэта
Netty не только поддерживает протокол HTTP, но также поддерживает несколько протоколов прикладного уровня, таких как SSH, TLS/SSL и т. д.
Tomcat должен следовать спецификации сервлетов. До версии Servlet 3.0 он использовал модель синхронной блокировки.
Netty имеет другую направленность, чем Tomcat. Ему не нужно ограничиваться спецификацией сервлета, и он максимально расширяет возможности NIO.
Мина
Это базовая структура NIO сервера Apache Directory (Netty — это обновленная версия Mina).
Гризли
MVC-фреймворк
Стойки
Стратс2
JSF (лица Java-сервера)
Вебворк
Xwork1
Вебворк2
Комбинация рамок
Структура SSM
SpringMVC Весенний Мибатис
веб-слой (springmvc), уровень обслуживания (spring) и уровень DAO (mybatis)
Структура SSMM
Spring SpringMVC Mybatis MySQL
SSH-фреймворк
Структуры Spring Hibernate
Пул соединений с базой данных
C3P0
ДБКП
друид
ХикариCP
проксол
JDBC-пул Tomcat
BoneCP
Гобелен
Другие фреймворки
структура кэширования
Экаче
Предоставляет память, хранилище файлов на диске, методы распределенного хранения и т. д.
Быстрый, простой, низкое потребление, низкая зависимость, высокая масштабируемость, поддержка кэша объектов или сериализации, поддержка аннулирования кэша или элементов.
Структурная схема
Каждый CacheManager может управлять несколькими кэшами, а каждый кэш может управлять несколькими элементами в виде хэша.
Элемент: используется для хранения реального содержимого кэша.
стратегия кэширования
ТТЛ
ЛРУ
Redis
кофеин
Инфиниспан
Обработка журналов
Лог4j
sl4j
Структура уровня сохраняемости
Спящий режим
Hibernate обеспечивает облегченную инкапсуляцию кода доступа JDBC к базе данных, что значительно упрощает утомительный и повторяющийся код уровня доступа к данным.
Мибатис
система безопасности
Весенняя безопасность
Широ
вычислительная структура
Буря
Нимб
Руководитель
Рабочий
Исполнитель
Задача
Топология
Носик
Болт
Кортеж
Группировка потоков
Перетасовать
Поля
Все
Глобальный
Никто
Прямой
Локальный или случайный
JStorm
Искра Стриминг
Флинк
Мигать
структура работы (запланированные задачи)
Кварц
Общие аннотации
@DisallowConcurrentExecution
компоненты
Подробности о вакансии
Курок
Простой триггер
КронТриггер
Календарь
Расписание
ЭластикДжоб
Весенняя задача
Кадр проверки
Валидатор спящего режима
Овал
Распределенная архитектура
кэш
уровень кэша
технология кэширования
[Сервер] Распределенный кэш
【CDN】Технология динамического кэширования
CSI (включая клиентскую часть)
Динамически включать содержимое другой страницы через iframe, javascript, ajax и т. д.
Страницу по-прежнему можно превратить в статическую HTML-страницу, а там, где требуется динамическая обработка, ее можно динамически загружать через iframe, javascript или ajax.
Относительно просто и не требует изменений и настроек на стороне сервера.
Не способствует поисковой оптимизации (метод iframe), проблемы совместимости с JavaScript и проблемы с кэшированием на стороне клиента могут привести к несвоевременным обновлениям.
SSI (включая серверную часть)
Загружайте различные модули с помощью команд SSI в строке комментариев и встраивайте их в HTML, чтобы обновлять содержимое всего веб-сайта.
Соответствующие файлы каждого модуля вызываются через SSI и окончательно собираются в html-страницу, для чего требуется поддержка серверного модуля.
Он не ограничен конкретными языками и относительно универсален. Требуется только поддержка веб-сервера или сервера приложений, таких как Ngnix, Apache, IIS и т. д.
SSI может быть загружен только на текущий сервер и не может напрямую включать файлы на других серверах (то есть его нельзя включать в разные домены).
ESI (включает крайнюю сторону)
Используйте простой язык разметки для описания фрагментов контента на веб-страницах, которые можно и нельзя ускорить.
Может использоваться для кэширования целых страниц или фрагментов страниц, в основном выполняется на кэш-серверах или прокси-серверах.
В настоящее время существует относительно мало программ, поддерживающих ESI, а официальные обновления происходят немного медленно, поэтому они не получили широкого распространения.
Алгоритм кэширования (алгоритм замены страниц)
ФИФО (первым пришел – первым обслужен)
первым прибыл, первым обслужен
LFU (наименее часто используемый)
Используйте массив для хранения элементов данных, используйте хеш-карту для хранения соответствующей позиции каждого элемента данных в массиве, а затем спроектируйте частоту доступа для каждого элемента данных. При попадании в элемент данных частота доступа автоматически увеличивается, и частота доступа увеличивается. доступ исключается при его устранении данных с наименьшей частотой.
ЛРУ
Элементы кэша имеют метку времени. Когда емкость кэша заполнена и необходимо освободить место для кэширования новых элементов, элементы с метками времени, наиболее удаленными от текущего времени среди существующих элементов кэша, будут удалены из кэша.
сцены, которые будут использоваться
1) Сохраняйте соответствие структуре данных в базе данных и кэшируйте как есть.
2) Кэширование сценариев сортировки и подкачки списков.
3) Кэш подсчета
4) Восстановить кеш измерений
5) Увеличенный кэш данных подробного контента.
проблема с кэшированием
Проникновение в кэш означает запрос данных, которые не должны существовать в базе данных.
решение
Обнаруживайте ключевые характеристики и перехватывайте вредоносные атаки
Если объект, запрошенный из базы данных, пуст, он также помещается в кэш. Установите более короткий срок действия кэша, например 60 секунд.
Лавина кэша означает централизованное истечение срока действия кэша в определенный период времени.
Разные категории товаров имеют разные периоды кэширования. Товары одной категории плюс случайный фактор
Пробой кэша означает, что ключ очень горячий и на доступе к этой точке сосредоточен большой параллелизм.
По истечении срока действия ключа непрерывный большой параллелизм прорывается через кеш и напрямую запрашивает базу данных.
Позволяет кэшу никогда не истекать
Решения для кэширования в действии
Концепция кэширования
Использование SpringCache
Стратегия согласованности кэша
Сценарий лавины кэша
Решение для проникновения в кэш
Три главных противоречия
Проблемы с кэшированием в реальном времени и согласованностью
стратегия в реальном времени
Приложение сначала извлекает данные из кеша. Если оно не получает их, оно извлекает данные из базы данных. После успеха оно помещает их в кеш.
Во время процесса записи данные сохраняются в базе данных. После успеха кэш аннулируется.
Проблема с проникновением в кэш
Асинхронная стратегия
читать
1) Если во время чтения его невозможно прочитать, он не обращается напрямую к базе данных и возвращает резервные данные.
2) Поместите событие загрузки данных в очередь сообщений, асинхронно прочитайте базу данных и обновите ее в кеш.
возобновлять
Сначала обновите базу данных, затем асинхронно обновите кеш.
Сначала обновите кеш, затем асинхронно обновите базу данных.
Кэшируйте высокий одновременный доступ к базе данных
Стратегия выбора времени
Приложение обращается только к кешу, а не к базе данных
Разделите целый фрагмент данных на несколько частей для кэширования и различайте часто обновляемые и редко обновляемые части.
Распределенное хранилище
Традиционное сетевое хранилище
НАН
Сетевой сервер, предоставляющий возможности хранения и файловую систему.
протокол
СМБ
НФС
АФС
САН
Предоставляется только блочное хранилище, а файловая система управляется клиентом.
протокол
оптоволоконный канал
iSCSI
ATA через Etherent (AoE)
ГиперSCSI
хранилище объектов
форма доступа
Доступ через объект веб-службы REST
Обрабатывается с помощью предопределенных методов HTTP.
ПОЛУЧАТЬ
Получить сетевой ресурс
ПОМЕЩАТЬ
Создать или заменить сетевой ресурс
ПОЧТА
Используется для создания ресурса. Если он уже существует, будет сообщено об ошибке.
УДАЛИТЬ
Удалить сетевой ресурс
служба метаданных
хеш-значение объекта
Хранилище объектов использует хэш-значение объекта в качестве глобального уникального идентификатора.
Используйте хеш-функцию с высокими цифрами для расчета хэш-значений, чтобы гарантировать, что данные с разным содержимым имеют разные хеш-значения.
сервисная архитектура
ЭластичныйПоиск
http
Загрузка точки останова
Высокодоступное хранилище данных
Практика высокопроизводительного хранения данных MySQL
Передовая практика Mycat
Практика распределенного хранения файлов FastDFS
Практика хранения файлов
Практика синхронизации файлов
Практика запроса файлов
Практика распределенного развертывания
Распределенные транзакции
уровень изоляции
Используется уровень изоляции базы данных по умолчанию.
MySQL по умолчанию использует повторяемое чтение
Oracle по умолчанию читает зафиксированное (чтение зафиксированное)
КИСЛОТА
атомарность
Атомарность означает, что вещь представляет собой неделимую единицу работы, и операции в ней либо происходят все, либо ни одна не происходит.
Последовательность
Целостность данных до и после транзакции должна быть согласованной.
Изоляция изоляция
Когда несколько пользователей обращаются к базе данных, транзакции, открытые базой данных для каждого пользователя, не могут мешать данным, управляемым другими транзакциями, и несколько одновременных транзакций должны быть изолированы друг от друга.
Долговечность
После отправки объекта изменения в данных в базе данных становятся постоянными, и даже если база данных выйдет из строя, это не окажет никакого влияния на данные.
Характеристики распространения транзакций
Гарантировано участие в той же транзакции PROPAGATION_REQUIRED поддерживает текущую транзакцию, если она не существует, создайте новую (по умолчанию) PROPAGATION_SUPPORTS поддерживает текущую транзакцию. Если она не существует, транзакция не будет использоваться. PROPAGATION_MANDATORY поддерживает текущую транзакцию. Если она не существует, выдается исключение. Гарантировано не в одной транзакции PROPAGATION_REQUIRES_NEW Если транзакция существует, приостановите текущую транзакцию и создайте новую транзакцию. PROPAGATION_NOT_SUPPORTED Запустить в нетранзакционном режиме. Если транзакция существует, приостановить текущую транзакцию. PROPAGATION_NEVER работает в нетранзакционном режиме и выдает исключение, если транзакция существует. PROPAGATION_NESTED Если текущая транзакция существует, выполняется вложенная транзакция.
Структура распределенных транзакций
2шт
3ПК
ДЖОТМ
Атомикос
Распределенный кластер
репликация главный-подчиненный
Чтение и запись разделения
Балансировка нагрузки
Распределенная блокировка
Характеристики распределенной блокировки
взаимная исключительность
Только один поток удерживает блокировку одновременно
Реентерабельность
Тот же поток на том же узле может снова получить блокировку после получения блокировки.
тайм-аут блокировки
Как и блокировка в пакете JUC, она поддерживает тайм-аут блокировки для предотвращения взаимоблокировки.
Высокая производительность и высокая доступность
Блокировка и разблокировка должны быть эффективными, а также обеспечивать высокую доступность для предотвращения сбоя распределенной блокировки.
Имеет функции блокировки и неблокировки.
Возможность вовремя выйти из заблокированного состояния
Реализация распределенной блокировки
основанный на базе данных
Проверьте реализацию самостоятельно
На основе Redis
На основе ZooKeeper
Проверьте реализацию самостоятельно
реализация Redis
Как реализовать блокировку
Использование команды setnx expire (неправильный подход)
Поскольку операция истечения срока действия setnx не является атомарной.
public boolean tryLock (String key, String requset, int timeout) { Длинный результат = jedis.setnx(key, requset); // Когда результат = 1, настройка успешна, иначе настройка не удалась если (результат == 1L) { return jedis.expire(ключ, тайм-аут) == 1L; } еще { вернуть ложь; } }
Используйте сценарий Lua (включая инструкции setnx и expire)
public boolean tryLock_with_lua (ключ String, String UniqueId, int секунды) { String lua_scripts = "if redis.call('setnx',KEYS[1],ARGV[1]) == 1 тогда" "redis.call('expire',KEYS[1],ARGV[2]) возвращает 1, иначе возвращает 0, конец"; Ключи List<String> = новый ArrayList<>(); Значения List<String> = new ArrayList<>(); ключи.добавить(ключ); значения.add(UniqueId); значения.add(String.valueOf(секунды)); Результат объекта = jedis.eval(lua_scripts, ключи, значения); //Определяем, успешно ли это вернуть результат.равен(1L); }
Используйте команду set key value [EX секунды][PX миллисекунды][NX|XX] (правильный подход).
Начиная с версии 2.6.12, Redis добавляет к команде SET ряд опций: Значение ключа SET[EX секунды][PX миллисекунды][NX|XX] EX секунды: установите срок действия в секундах. PX миллисекунды: установите срок действия в миллисекундах. NX: устанавливать значение только в том случае, если ключ не существует. XX: Установите значение, только если ключ существует.
public boolean tryLock_with_set (ключ String, String UniqueId, int секунды) { return "OK".equals(jedis.set(key, UniqueId, "NX", "EX", секунды)); }
Значение должно быть уникальным. Для этого мы можем использовать UUID и установить случайную строку, чтобы обеспечить уникальность. Зачем нам обеспечивать уникальность? Если значение является не случайной строкой, а фиксированным значением, могут возникнуть следующие проблемы: 1. Клиент 1 успешно получает блокировку. 2. Клиент 1 слишком долго блокировал операцию. 3. Срок действия установленного ключа истекает, и блокировка автоматически снимается. 4. Клиент 2 получает блокировку, соответствующую тому же ресурсу. 5. Клиент 1 восстанавливается после блокировки. Поскольку значение одинаковое, блокировка, удерживаемая клиентом 2, будет снята при выполнении операции снятия блокировки, что вызовет проблемы.
Вообще говоря, при снятии блокировки нам необходимо проверить значение
Использование команды set key value [EX секунды][PX миллисекунды][NX|XX] кажется нормальным, но в режиме кластера Redis все равно могут возникать проблемы.
Клиент А получает блокировку на Мастере. В это время Мастер не синхронизировал ключ с подчиненным узлом. Главный узел выбран в качестве Мастера. В это время клиент также может выполнить операцию. повторное получение блокировки. Их будет несколько. Клиент получил блокировку.
Разблокировать метод реализации
Чтобы разблокировать, нам нужно проверить значение value. Мы не можем использовать ключ del напрямую, потому что любой клиент может его разблокировать. Поэтому при разблокировке нам необходимо проверить, является ли значение нашим собственным, и судить на основе значения.
общедоступное логическое значение ReleaseLock_with_lua (строковый ключ, строковое значение) { String luaScript = "if redis.call('get',KEYS[1]) == ARGV[1] then " "return redis.call('del',KEYS[1]) else return 0 end"; return jedis.eval(luaScript, Collections.singletonList(ключ), Collections.singletonList(значение)).equals(1L); }
восстановление
Редлок
Принцип реализации
Получите текущее время Unix в миллисекундах.
Попробуйте 5 раз подряд, используя один и тот же ключ и
Уникальное значение (например, UUID) получает блокировку. При запросе блокировки у Redis клиент должен установить сетевое подключение и таймаут ответа, который должен быть меньше времени истечения срока действия блокировки. Например, если время автоматического истечения срока действия вашей блокировки составляет 10 секунд, время ожидания должно составлять от 5 до 50 миллисекунд. Это позволит избежать ситуации, когда Redis на стороне сервера зависает, а клиент все еще ожидает результата ответа. Если сервер не отвечает в течение указанного времени, клиент должен попытаться получить блокировку от другого экземпляра Redis как можно скорее.
Клиент использует текущее время минус время, когда он начал получать блокировку (время, записанное на шаге 1), чтобы получить время, использованное для получения блокировки.
Блокировка считается успешной тогда и только тогда, когда блокировка получена от большинства (N/2 1, здесь — 3 узла) узлов Redis и время использования меньше времени истечения срока действия блокировки.
Если блокировка получена, реальное время действия ключа равно действительному времени минус время, использованное для получения блокировки (результат, рассчитанный на шаге 3).
Если по какой-либо причине получить блокировку не удается (блокировка не получена как минимум на N/2 1 экземплярах Redis или время получения блокировки превысило эффективное время), клиент должен
Разблокируйте все экземпляры Redis (даже если некоторые экземпляры Redis вообще не заблокированы успешно, это не позволяет некоторым узлам получить блокировку, но клиент не получает ответа, и блокировку невозможно получить повторно в течение определенного периода времени).
Применение
Представьте пом
<!-- https://mvnrepository.com/artifact/org.redisson/redisson --> <зависимость> <groupId>org.redisson</groupId> <artifactId>передиссон</artifactId> <версия>3.3.2</версия> </зависимость>
Получить блокировку
Код для получения блокировки — redLock.tryLock() или redLock.tryLock(500, 10000, TimeUnit.MILLISCONDS. Окончательный основной исходный код обоих — это следующий код, но время аренды по умолчанию (leaseTime) для первого равно. получить блокировку — LOCK_EXPIRATION_INTERVAL_SECONDS, то есть 30 секунд:
Конфигурация конфигурации = новая конфигурация(); config.useSentinelServers().addSentinelAddress("127.0.0.1:6369", "127.0.0.1:6379", "127.0.0.1:6389") .setMasterName("masterName") .setPassword("пароль").setDatabase(0); RedissonClient redissonClient = Redisson.create(config); // Вы также можете получитьFairLock(), getReadWriteLock() RLock redLock = redissonClient.getLock("REDLOCK_KEY"); логическое значение isLock; пытаться { isLock = redLock.tryLock(); // Если блокировку невозможно получить в течение 500 мс, считается, что получение блокировки не удалось. 10000 мс или 10 с — время истечения блокировки. isLock = redLock.tryLock(500, 10000, TimeUnit.МИЛЛИСЕКУНДЫ); если (isLock) { //TODO, если блокировка прошла успешно, сделать что-нибудь; } } catch (Исключение е) { } окончательно { // Несмотря ни на что, в конце концов его нужно разблокировать красныйLock.unlock(); }
KEYS[1] — это Collections.singletonList(getName()), который представляет ключ распределенной блокировки, то есть REDLOCK_KEY; ARGV[1] — это InternalLockLeaseTime, который представляет собой время аренды блокировки. Значение по умолчанию — 30 с. ARGV[2] — это getLockName(threadId), единственное значение, устанавливаемое при получении блокировки, то есть UUID threadId:
Уникальный идентификатор
Очень важным моментом при реализации распределенных блокировок является то, что значение набора должно быть уникальным. Как значение redisson обеспечивает уникальность значения? Ответ: UUID threadId
защищенный окончательный идентификатор UUID = UUID.randomUUID(); Строка getLockName (длинный идентификатор потока) { вернуть идентификатор ":" threadId; }
Разблокировать
Код для снятия блокировки — redLock.unlock().
Балансировка нагрузки
Четырехуровневая балансировка нагрузки против семиуровневой балансировки нагрузки
Балансировка нагрузки уровня 4 (адрес назначения и переключение портов)
F5: Аппаратный балансировщик нагрузки, очень функциональный, но очень дорогой.
Ivs: мощное программное обеспечение для четырехуровневой загрузки.
nginx: легкое четырехуровневое программное обеспечение для загрузки с функцией кэширования и гибкими регулярными выражениями.
haproxy: имитирует пересылку уровня 4 и является более гибким.
Семиуровневая балансировка нагрузки (переключение контента)
haproxy: встроенная технология балансировки нагрузки, полностью поддерживает семиуровневый прокси, защиту сеансов, маркировку и передачу путей:
nginx: он имеет лучшие функции только по протоколу http и почтовому протоколу, а его производительность аналогична haproxy:
Apache: плохая функциональность
Прокси Mysql: функция приемлема.
Алгоритм/стратегия балансировки нагрузки
По-круговой
Взвешенный круговой турнир
Случайное равновесие (Случайное)
Взвешенный случайный баланс
Баланс скорости отклика (время определения времени отклика)
Наименьший баланс соединения
Баланс вычислительной мощности (ЦП, память)
Балансировка ответов DNS (Flash DNS)
Хэш-алгоритм
Хеширование IP-адреса (для обеспечения стабильной переписки клиент-сервер)
URL-хеш
ЛВС
Принцип LVS
Режим LVS NAT
① Клиент отправляет запрос внешнему балансировщику нагрузки. Адрес источника сообщения запроса — CIP (IP-адрес клиента), далее именуемый CIP, а адрес назначения — VIP (внешний адрес балансировщика нагрузки). (далее совместно именуемые VIP).
②. После того, как балансировщик нагрузки получает сообщение и обнаруживает, что запрос относится к адресу, который существует в правиле, он меняет целевой адрес сообщения запроса клиента на RIP-адрес внутреннего сервера и отправляет сообщение в соответствии с алгоритм.
⑧. После отправки сообщения на реальный сервер, поскольку адрес назначения сообщения является самим собой, он ответит на запрос и вернет ответное сообщение в LVS.
④ Затем lvs меняет исходный адрес этого сообщения на локальный компьютер и отправляет его клиенту.
Функции
1. Технология NAT требует, чтобы сообщение запроса и ответное сообщение переписывались через LB. Поэтому при относительно большом количестве посещений веб-сайта возникает относительно большое узкое место в планировщике балансировки нагрузки LB. Обычно максимум 10-20 единиц. необходимы.
2. Вам нужно только настроить адрес 1P общедоступной сети на LB.
3. Адрес шлюза каждого внутреннего сервера реального сервера должен быть адресом интрасети планировщика LB.
4. Режим NAT поддерживает преобразование IP-адресов и портов. То есть порт, запрошенный пользователем, и порт реального сервера могут не совпадать.
преимущество
Физические серверы в кластере могут использовать любую операционную систему, поддерживающую TCP/IP, только для балансировщика нагрузки требуется действительный IP-адрес.
недостаток
Масштабируемость ограничена. Когда серверные узлы (обычные ПК-серверы) разрастаются слишком сильно, балансировщик нагрузки становится узким местом всей системы, поскольку все пакеты запросов и пакеты ответов проходят через балансировщик нагрузки.
Когда серверных узлов слишком много, большое количество пакетов данных будет сходиться на балансировщике нагрузки, и скорость снизится!
Режим LVS DR (LAN перезаписывает MAC-адрес)
① Клиент отправляет запрос внешнему балансировщику нагрузки. Адрес источника сообщения запроса — CIP, а адрес назначения — VIP.
② После того, как балансировщик нагрузки получает сообщение и обнаруживает, что запрос относится к адресу, который существует в правиле, он меняет исходный MAC-адрес сообщения запроса клиента на свой собственный MAC-адрес DIP и меняет целевой MAC на RIP. MAC-адрес и отправьте этот пакет в RS.
③. Когда RS обнаружит, что MAC-адрес назначения в сообщении запроса является самим собой, он получит сообщение. После обработки сообщения запроса он отправит ответное сообщение на сетевую карту ethO через интерфейс lo и отправит его непосредственно клиенту. .
Функции
1. Пересылка реализуется путем изменения MAC-адреса назначения пакета данных в планировщике LB. Обратите внимание, что исходным адресом по-прежнему является CIP, а адресом назначения по-прежнему является VIP-адрес.
2. Запрошенное сообщение проходит через планировщик, в то время как обработанное сообщение ответа RS не должно проходить через LB планировщика, поэтому эффективность использования очень высока, когда объем одновременного доступа велик (по сравнению с режимом NAT).
3. Поскольку режим DR реализует пересылку через механизм перезаписи MAC-адресов, все узлы RS и LB планировщика могут находиться только в одной локальной сети.
4. Хосту RS необходимо привязать VIP-адрес к интерфейсу LO (маска 32 бита) и настроить подавление ARP.
5. Шлюз по умолчанию узла RS не нужно настраивать как LB, а напрямую настраивать как шлюз маршрута верхнего уровня, что позволяет RS напрямую выходить из сети.
преимущество
Как и TUN (туннельный режим), балансировщик нагрузки только распределяет запросы, а пакеты ответов возвращаются клиенту через отдельный метод маршрутизации. По сравнению с VS-TUN, VS-DR не требует туннельной структуры, поэтому большинство операционных систем можно использовать в качестве физических серверов.
Режим DR очень эффективен, но его настройка немного сложнее, поэтому компании, у которых нет особенно большого количества посещений, могут вместо этого использовать haproxy/nginx. Если у вас 1000–2000 Вт PV в день или менее 10 000 одновременных запросов, вы можете рассмотреть возможность использования haproxy/nginx.
недостаток
Все узлы RS и планировщик LB могут находиться только в одной локальной сети.
Режим LVS TUN (инкапсуляция P, межсетевой сегмент)
① Клиент отправляет запрос внешнему балансировщику нагрузки. Адрес источника сообщения запроса — CIP, а адрес назначения — VIP.
②. После того как балансировщик нагрузки получит сообщение и обнаружит, что запрос относится к адресу, который существует в правиле, он инкапсулирует IP-сообщение в заголовок сообщения запроса клиента и изменит исходный адрес на DIP и адрес назначения. Перейдите на RIP и отправьте этот пакет в RS.
③. После получения сообщения запроса RS сначала распакует первый уровень инкапсуляции, а затем обнаружит, что целевой адрес IP-заголовка является VIP на его собственном интерфейсе lo, поэтому он обработает сообщение запроса и сообщит ответ. Файл отправляется на сетевую карту ethO через интерфейс lo и отправляется непосредственно клиенту.
Функции
1. Режим TUNNEL должен привязывать VIP IP-адреса на всех машинах реальных серверов.
2. Режим TUNNEL vip ------> пакетная связь реального сервера осуществляется через режим TUNNEL, и он может взаимодействовать независимо от того, является ли это внутренней сетью или внешней сетью, поэтому нет необходимости /vs vip и realserver находиться в тот же сегмент сети.
3. В режиме TUNNEL реальный сервер отправит пакет непосредственно клиенту, а не Ivs.
4. В режиме ТУННЕЛЬ используется туннельный режим, поэтому его сложно использовать и обслуживать, поэтому он обычно не используется.
преимущество
Балансировщик нагрузки отвечает только за распространение пакетов запросов на серверы внутренних узлов, тогда как RS отправляет пакеты ответов непосредственно пользователям.
Благодаря уменьшению большого объема потока данных в балансировщике нагрузки балансировщик больше не является узким местом системы и может обрабатывать огромное количество запросов. Таким образом, один балансировщик нагрузки может распределять нагрузку на множество RS. И его можно распространять в разных регионах, запустив в общедоступном Интернете.
недостаток
Узел RS в туннельном режиме требует разрешенного IP-адреса. Для этого метода требуется, чтобы все серверы поддерживали протокол IP-туннелирования (IPEncapsulation). Сервер может быть ограничен некоторыми системами Linux.
Режим LVS FULLNAT
1. При передаче пакета из LVS в RS адрес источника заменяется с клиента 1P на внутренний IP LVS. IP-адреса интрасети могут обмениваться данными между сетями VLAN через несколько коммутаторов. Адрес назначения изменен с VIP на RS IP.
2. Когда RS обрабатывает полученный пакет и возвращается после обработки, он меняет целевой адрес на IP-адрес LVS, исходный адрес на RSIP и, наконец, возвращает пакет на IP-адрес внутренней сети LVS. Этот шаг не ограничен.
3. После того, как LVS получает пакет, на основе изменения адреса источника в режиме NAT он меняет адрес назначения в пакете, отправленном RS, с IP-адреса интрасети LVS на 1P клиента и меняет исходный адрес на VIP.
Подведем итог
1. Режим FULL NAT не требует, чтобы LBIP и IP-адрес реального сервера находились в одном сегменте сети;
2. Поскольку исходный IP-адрес необходимо обновить, производительность полного режима nat обычно на 10 % ниже, чем в режиме nat.
Поддерживать активность
Keepalive изначально был разработан для LVS и специально использовался для мониторинга состояния каждого сервисного узла LVS. Позже была добавлена функция vrrp, поэтому в дополнение к LVS его также можно использовать в качестве программного обеспечения высокой доступности для других сервисов ( nginx, хапрокси)
VRRP — это аббревиатура протокола резервирования виртуального маршрутизатора. Появление VRRP призвано решить единую точку отказа в статической маршрутизации. Он может обеспечить бесперебойную и стабильную работу сети.
Балансировка нагрузки обратного прокси Nginx
upstream_module и обнаружение работоспособности
пересылка запроса pproxy_pass
HAProxy
Распределенная координация и разгрузка
Zookeeper — командир распределенной среды
Начало работы с ЗК
основы разработки zk
практика применения зоопарка
Анализ протоколов и алгоритмов
Передовая практика разгрузки высокой параллелизма Nginx
установка nginx
Прямой и обратный прокси
модель процесса nginx
основная структура конфигурации
Конфигурация журнала и подпись
правила местоположения
Использование перезаписи
Разделение движения и неподвижности
Междоменная конфигурация
Конфигурация кэша, конфигурация Gzip
https конфигурация
Проблемы, вызванные горизонтальным расширением
ЛВС
поддерживать активность
распределенная согласованность
Алгоритм Рафта
Функции
Запись в базу данных на основе кворума
Половина операций записи из базы данных успешны, что означает, что операция прошла успешно.
Главная библиотека записывает журнал и отправляет его в подчиненную библиотеку.
Три типа журналов: BinLog, RedoLog, UndoLog.
Выбор на основе сравнения журналов
Определите, чей журнал является последним (определяется на основе индекса журнала в запросе голосования других узлов и вашего собственного индекса журнала)
Классификация ролей
Лидер
Кандидат (кандидат в лидеры)
Последователь
Тип сообщения
Запросить голосование
Запросить другие узлы проголосовать за себя (обычно выдается кандидатом)
AppendEntries
Используется для репликации журнала, указывает записи, добавленные в журнал, используется для контрольного сигнала, когда количество записей равно 0.
Отправлено Лидером
Практическая реализация общих распределенных решений
концепция сделки
Транзакции и блокировки
История распределенных транзакций
Модель транзакции X/OpenDTP
Стандартные распределенные транзакции
Решения для распределенных транзакций
двухфазная фиксация
БАЗОВАЯ теория и гибкие дела
Схема ТСС
компенсационный план
Гарантированная асинхронность и максимум усилий
Решение для единого входа
Проблема с единым входом
Междоменные проблемы страницы
Решение для междоменного совместного использования сеансов
Расширение сеанса
Решение для распределенного планирования задач
Как использовать планирование Quartz
Пример Elastic-Job
Трудности в распределенном планировании
Индивидуальное распределенное планирование кластера Quartz
Распределенная структура и промежуточное программное обеспечение
Распределенные вызовы
RPC (удаленный вызов)
Спокойный
промежуточное программное обеспечение
Кэширование/постоянство
Распределенный кеш
Redis (сервер удаленного словаря)
объектные отношения
Структурная схема
Классификация памяти
объектная память
буферная память
Буферизация клиента
Буфер АОФ
Копировать буфер невыполненной работы
В основном используется для синхронизации master-slave.
собственная память
Потребление памяти дочерним процессом создания Redis при использовании AOF/RDB
фрагментация памяти
Необязательные распределители: jemalloc, glibc, tcmalloc, по умолчанию — jemalloc.
Решение для высокой фрагментации памяти: выравнивание данных, безопасный перезапуск (высокая доступность/переключение между главным и подчиненным)
Стратегия восстановления памяти
Ленивое удаление
Он не будет активно удалять пары ключ-значение с истекшим сроком действия, а будет ждать, пока клиент прочитает ключ. Если время ожидания истекло, удалите объект пары ключ-значение, а затем вернет пустой результат.
Удалить запланированные задачи
Трубопровод
Redis использует модель клиент-сервер (CS) и TCP-сервер с протоколом запросов/ответов. Это означает, что обычно запрос состоит из следующих шагов:
Клиент отправляет запрос на сервер и слушает ответ Socket, обычно в режиме блокировки, ожидая ответа сервера.
Сервер обрабатывает команду и возвращает результаты клиенту.
Протокол TCP используется для соединения клиента Redis и сервера Redis. Клиент может инициировать несколько команд запроса через соединение через сокет. После выдачи каждой команды запроса клиент обычно блокируется и ожидает обработки сервера Redis. После того, как Redis обработает команду запроса, результат будет возвращен клиенту в виде ответного сообщения. Поэтому при выполнении нескольких команд вам необходимо выполнить следующее. дождитесь выполнения предыдущей команды.
Конвейер может отправлять несколько команд одновременно и возвращать результаты сразу после выполнения. Конвейер сокращает время двусторонней задержки за счет уменьшения количества сообщений между клиентом и Redis, а принцип реализации конвейера — очередь, а принцип работы — очередь. очередь первая пришла — первая вышла, обеспечивая тем самым порядок данных. Число синхронизаций по умолчанию в Pipeline — 53, что означает, что данные будут отправлены, когда в аргументах накопится 53 фрагмента данных. Процесс показан на рисунке ниже: клиент может поместить три команды в одно TCP-сообщение и отправить их вместе, а сервер может поместить результаты обработки трех команд в одно TCP-сообщение и вернуть их.
Следует отметить, что команды упаковываются и отправляются в конвейерном режиме, и Redis должен кэшировать результаты обработки всех команд перед их обработкой. Чем больше команд вы упаковываете, тем больше памяти потребляет кеш. Так что дело не в том, что чем больше команд вы упаковаете, тем лучше. Конкретная степень целесообразности должна быть проверена в соответствии с конкретной ситуацией.
Так как будет сетевая задержка связи, если время передачи пакета между клиентом и сервером будет составлять 0,125 секунды. Тогда выполнение трех вышеуказанных команд и шести сообщений займет не менее 0,75 секунды. Таким образом, даже если Redis может обрабатывать 100 команд в секунду, наш клиент может выдавать только четыре команды в секунду. Очевидно, что это не полностью использует вычислительную мощность Redis.
Применимая сцена
В некоторых системах могут быть очень высокие требования к надежности. Для каждой операции необходимо сразу знать, прошла ли операция успешно и были ли записаны данные в redis. В этом случае такой сценарий не подходит.
В других системах данные могут записываться в Redis пакетно, что допускает определенную долю ошибок записи. Тогда можно использовать этот сценарий. Например, если в Redis одновременно вводится 10 000 записей, то сбой в двух записях может не иметь значения. В будущем будет механизм компенсации. Вот и все. Например, в сценарии массовой смс-рассылки, если одновременно отправить 10 000 сообщений и реализовать по первому режиму, то на ответ потребуется много времени. клиенту при поступлении запроса. Задержка слишком велика. Если клиент запрашивает настройки. Если таймаут составляет 5 секунд, обязательно будет выброшено исключение, а требования к групповому обмену текстовыми сообщениями в реальном времени не так высоки. время лучше всего использовать конвейер.
Конвейерная обработка против сценариев
Сценарии приложений с большим конвейером можно более эффективно обрабатывать с помощью сценариев Redis (версия Redis >= 2.6), которые выполняют большую часть работы на стороне сервера. Одним из больших преимуществ сценариев является то, что они могут читать и записывать данные с минимальной задержкой, делая такие операции, как чтение, вычисление и запись, очень быстрыми (в этом случае нельзя использовать конвейер, поскольку клиенту необходимо прочитать результаты, возвращаемые сценарием). команду перед написанием команды).
Приложения могут иногда отправлять команды EVAL или EVALSHA в конвейере. Redis явно поддерживает этот случай с помощью команды SCRIPT LOAD (которая гарантирует успешный вызов EVALSHA).
Кластерное решение Redis
твемпрокси
Redis-кластер (redis-кластер)
Redis-Cluster использует бесцентровую структуру. Каждый узел сохраняет данные и состояние всего кластера, и каждый узел связан со всеми другими узлами.
Конструктивные особенности
Все узлы Redis взаимосвязаны друг с другом (механизм PING-PONG), а внутри используется двоичный протокол для оптимизации скорости передачи и пропускной способности.
Сбой узла вступает в силу только тогда, когда более половины узлов в кластере обнаруживают сбои.
Клиент напрямую подключается к узлу Redis без необходимости использования промежуточного прокси-уровня. Клиенту не нужно подключаться ко всем узлам кластера, достаточно подключиться к любому доступному узлу в кластере.
redis-cluster сопоставляет все физические узлы со слотом [0-16383] (не обязательно равномерно распределенным), а кластер отвечает за поддержание значения node<->slot<->. (хеш-кольцо) 2 в 14-й степени
Кластер Redis предварительно разделен на 16384 сегмента. Когда необходимо поместить ключ-значение в кластер Redis, сегмент, в который помещается ключ, определяется на основе значения CRC16(key) mod 16384.
выделение узла кластера Redis
Теперь у нас есть три основных узла: A, B и C. Это могут быть три порта на одной машине или три разных сервера. Затем, если 16384 слота выделяются с использованием хэш-слотов, интервалы слотов, принимаемые тремя узлами, равны
Узел A охватывает 0–5460;
Узел B охватывает номера 5461-10922;
Узел C охватывает 10923-16383.
получить данные
Если значение сохранено, следуйте алгоритму хеш-слота кластера Redis: CRC16('key')384 = 6782. Тогда хранилище этого ключа будет выделено B. Аналогично, когда я подключаюсь к любому узлу (A, B, C) и хочу получить ключ «ключ», я также буду использовать этот алгоритм, а затем внутренне перейду к узлу B, чтобы получить данные.
Добавить новый главный узел
Добавьте новый узел D. Метод кластера Redis заключается в том, чтобы взять часть слота спереди каждого узла и поместить его в D.
Узел А охватывает 1365-5460.
Узел B охватывает 6827-10922.
Узел C охватывает 12288-16383.
Узел D охватывает 0–1364, 5461–6826, 10923–12287.
Удалить главный узел
Удаление узла аналогично. Вы можете удалить узел после завершения перемещения.
Режим «главный-подчиненный» кластера Redis
Чтобы обеспечить высокую доступность данных, в кластер Redis добавлен режим «главный-подчиненный». Один главный узел соответствует одному или нескольким подчиненным узлам. Главный узел обеспечивает доступ к данным, а подчиненный узел извлекает резервную копию данных из главного узла. Когда главный узел зависает. После сбоя один из подчиненных узлов будет выбран в качестве главного узла, чтобы гарантировать, что кластер не зависнет.
В результате Redis «главный-подчиненный» каскадная структура и инкрементальная синхронизация в зависимости от того, является ли она полным томом.
Построение кластера Redis
В кластере должно быть как минимум нечетное количество узлов, то есть не менее трех узлов, каждый из которых имеет хотя бы один резервный узел.
В результате Redis «главный-подчиненный» каскадная структура и инкрементальная синхронизация в зависимости от того, является ли она полным томом.
Синхронизация главный-подчиненный
Данные могут быть синхронизированы с главного сервера на любой подчиненный сервер, а подчиненный сервер может быть главным сервером, связанным с другими серверами. Поскольку механизм публикации/подписки полностью реализован, когда подчиненная база данных синхронизирует дерево где угодно, она может подписаться на канал и получать полную запись выпуска сообщения главного сервера. Синхронизация полезна для масштабируемости и избыточности данных операций чтения.
Принцип работы
Полная синхронизация
Полная синхронизация Redis обычно происходит на этапе инициализации ведомого устройства. В это время необходимо скопировать все данные на ведущем устройстве.
1. Подчиненный сервер подключается к главному серверу и отправляет команду SYNC;
2. После того, как главный сервер получает имя SYNC, он начинает выполнять команду BGSAVE для создания файла RDB и использует буфер для записи всех команд записи, выполненных после этого;
3. После выполнения BGSAVE главного сервера он отправляет файлы снимков на все подчиненные серверы и продолжает записывать выполненные команды записи в течение периода отправки;
4. После получения файла снимка с сервера удалите все старые данные и загрузите полученный снимок;
5. После отправки снимка главного сервера он начинает отправлять команду записи в буфер на подчиненный сервер;
6. Подчиненный сервер завершает загрузку снимка, начинает получать запросы команд и выполняет команды записи из буфера главного сервера;
После выполнения вышеописанных действий все операции инициализации данных с подчиненного сервера завершены. Теперь подчиненный сервер может принимать запросы на чтение от пользователей.
Инкрементная синхронизация
Инкрементная синхронизация Redis — это процесс синхронизации операций записи, которые произошли на главном сервере, с подчиненным сервером, когда подчиненный сервер Redis инициализируется и начинает работать нормально.
Инкрементная репликация в основном означает, что каждый раз, когда главный сервер получает команду записи, он отправляет одну и ту же команду записи на подчиненный сервер, а подчиненный сервер получает и выполняет ту же команду записи.
Стратегия синхронизации Redis Master-Slave
При запуске соединения «главный-подчиненный» выполняется полная синхронизация, а после ее завершения — инкрементная синхронизация.
При необходимости ведомое устройство может в любой момент инициировать полную синхронизацию.
Стратегия Redis заключается в том, чтобы сначала выполнить инкрементную синхронизацию, а затем выполнить полную синхронизацию, если синхронизация не удалась.
Примечание. Когда несколько подчиненных устройств отключены, их необходимо перезапустить. При перезапуске синхронизация будет автоматически отправлена на запрос к главному серверу для полной синхронизации. Когда одновременно появляются несколько подчиненных устройств, это приведет к резкому увеличению количества операций ввода-вывода мастера. время простоя.
Высокая доступность в архитектуре Redis Sentinel
Когда главный узел зависает, необходимо вручную повысить статус подчиненного узла до главного узла и в то же время уведомить бизнес-сторону об изменении адреса главного узла. Такой метод обработки ошибок неприемлем для определенных сценариев применения. Redis предоставляет дозорную архитектуру в версии 2.8 для решения этой проблемы.
Принцип реализации
Три запланированные задачи мониторинга
Каждые 10 секунд каждый дозорный узел отправляет информационную команду главному и подчиненному узлу для получения последней структуры топологии.
Каждые 2 секунды каждый дозорный узел отправляет заключение текущего дозорного узла о главном узле и информацию о текущем дозорном узле в канал _sentinel_:hello узла данных Redis. В то же время каждый дозорный узел также подпишется на него. канал, чтобы узнать о других дозорных узлах и их суждениях о главном узле.
Каждую секунду Sentinel будет отправлять команду ping на главный и подчиненный узлы для проверки пульса, чтобы подтвердить, доступны ли эти узлы в данный момент.
Субъективный офлайн
Поскольку каждую секунду каждый узел Sentinel отправляет команду ping главному узлу, подчиненному узлу и другим узлам Sentinel для обнаружения пульса. Если эти узлы не отвечают эффективно в течение более чем нескольких миллисекунд, узел Sentinel отключится. узел определяет неисправность. Такое поведение называется субъективным автономным режимом.
Цель офлайн
Когда узел, который Sentinel по субъективному мнению отключается от сети, является главным узлом, узел Sentinel запросит у других узлов Sentinel их мнение о главном узле. Когда число превышает <кворум>, это означает, что большинство узлов Sentinel не уверены в отношении главного узла. главный узел. Сеть принимает единогласное решение, поэтому узел Sentinel считает, что с главным узлом действительно существует проблема. В это время узел Sentinel примет объективное решение о выходе из сети.
Выборы лидера дозорного узла
Алгоритм Raft предполагает, что s1 (sentinel-1) первым выполнит задачу в автономном режиме. Он отправит команды другим узлам Sentinel и попросит стать лидером, если узел Sentinel, получивший команду, не согласился на запрос. другие узлы Sentinel, он согласится на запрос s1, в противном случае он будет отклонен, если s1 обнаружит, что количество его голосов больше или равно определенному значению, тогда он станет лидером;
аварийное переключение
1. Лидерный узел Sentinel выбирает узел из подчиненных узлов в качестве нового главного узла.
2. Вышеописанный метод выбора — подчиненный узел с наибольшим сходством репликации с главным узлом.
3. Лидерный узел Sentinel позволяет другим подчиненным узлам становиться подчиненными узлами нового главного узла.
4. Коллекция Sentinel превратит исходный главный узел в подчиненный узел, будет следить за ним и прикажет скопировать новый главный узел при его восстановлении.
Высокая доступность в Redis Cluster (кластере)
Принцип реализации
Субъективный офлайн
Каждый узел в кластере периодически отправляет ping-сообщения другим узлам, а принимающие узлы отвечают ping-сообщениями в ответ. Если связь по-прежнему терпит неудачу в течение времени ожидания узла кластера, отправляющий узел сочтет принимающий узел неисправным и пометит принимающий узел как субъективно отключенный (pfail).
Цель офлайн
Когда узел определяет, что другой узел субъективно отключен, соответствующий статус узла будет следовать за сообщением и распространяться внутри кластера.
Предположим, что узел a помечает узел b как субъективно отключенный. Через некоторое время узел a отправляет статус узла b другим узлам через сообщения. Когда другие узлы получают сообщение и анализируют статус pfail узла b в теле сообщения. добавлен узел b в список цепочек автономных отчетов;
Когда определенный узел c получает статус pfail узла b, и более половины мастер-узлов слотов пометили узел b как статус pfail, неисправный узел b помечается как объективно отключенный;
Пересылает сообщение pfail в кластер, уведомляя все узлы в кластере о необходимости пометить неисправный узел b как объективно отключенный и немедленно вступая в силу. Оно также уведомляет подчиненный узел о неисправном узле b, чтобы запустить процесс переключения при отказе.
Восстановление
Проверка приемлемости
Если подчиненный узел отключен от главного узла более чем на определенный период времени, он не будет иметь права.
Подготовка к выборам
Если подчиненный узел имеет право на аварийное переключение, он будет ждать некоторое время, прежде чем начать выборы.
Среди всех подчиненных узлов неисправного узла первым начинает выборы подчиненный узел с наибольшим смещением репликации (наиболее согласующийся с данными главного узла), а затем второй по величине узел начинает выборы... а остальные подчиненные узлы ждут, пока наступит время их выборов, прежде чем проводить выборы.
Инициировать выборы
Только главный узел, владеющий слотом, имеет уникальный голос. Когда от ведомого узла собрано N/2 1 главный узел, владеющий слотом, ведомый узел может выполнить операцию замены главного узла.
голосование на выборах
Замените главный узел
Когда на подчиненном узле собрано достаточное количество голосов, запускается операция замены главного узла.
Текущий подчиненный узел отменяет репликацию и становится главным узлом.
Отозвать слоты, ответственные за вышедший из строя главный узел, и делегировать эти слоты себе.
Передать собственное сообщение Pong в кластер, чтобы уведомить все узлы в кластере о том, что текущий подчиненный узел стал главным узлом и принял на себя информацию о слоте вышедшего из строя главного узла.
асинхронная очередь
Использовать список как очередь
RPUSH действует как производитель для создания сообщений, а LPOP выступает в качестве потребителя для потребления сообщений.
Недостатки: нет очереди ожидания, и вы можете использовать ее напрямую, если есть ценность. Макияж: вы можете вызвать LOOP через механизм сна на уровне приложения, чтобы повторить попытку. Если вы не используете механизм сна, вы можете использовать тайм-аут BLPOP key[key..] для блокировки до тех пор, пока в очереди не появится сообщение или не истечет время ожидания.
Один производитель соответствует одному потребителю
Как произвести один раз и сделать его доступным множеству потребителей
pub/sub: режим подписки на тему
Отправитель (публикация) отправляет сообщение, а подписчик (подписчик) получает сообщение.
Абоненты могут подписаться на любое количество каналов.
Недостатки: Сообщения не имеют состояния, и их доступность не может быть гарантирована.
Как реализовать очередь задержки
Использовать набор сортировки
Принять временную метку в качестве результата
Содержимое сообщения используется в качестве ключа для вызова zadd для создания сообщения.
Потребитель использует инструкцию zrangeBysocre для получения данных опроса N секунд назад для обработки.
Постоянство Redis
Режим сохранения RDB (база данных Redis)
принцип
Сохранение RDB означает запись моментального снимка набора данных из памяти на диск в течение определенного интервала времени. Фактический процесс работы заключается в создании дочернего процесса, сначала записи набора данных во временный файл, а затем замене предыдущего файла после. запись успешна, сохранена с использованием двоичного сжатия.
Преимущество
1. Как только вы примете этот подход, вся ваша библиотека Redis будет содержать только один файл, который идеально подходит для резервного копирования файлов. Например, вы планируете синхронизировать данные за 24 часа каждый час и данные за 30 дней каждый день. Благодаря этой конфигурации мы можем легко восстановить данные в случае катастрофического сбоя.
2. Для аварийного восстановления RDB — очень хороший выбор, поскольку мы можем легко сжать отдельный файл, а затем скопировать его на другой носитель.
3. Максимизируйте производительность для процесса службы Redis при запуске персистентности, единственное, что нужно сделать, — это выделить дочерний процесс и предоставить дочернему процессу все остальное для завершения операции персистентности, что значительно предотвращает выполнение процесса службы. Операции ввода-вывода.
4. По сравнению с механизмом AOF, если набор данных большой, эффективность запуска RDB будет выше.
недостаток
1. Если вы хотите обеспечить высокую доступность данных, то есть в наибольшей степени избежать потери данных, RDB — не лучший выбор, поскольку, если система выйдет из строя до определенного времени устойчивости, данные, которые не были сохранены в диск будет потерян.
2. Поскольку дочерний процесс fork используется для помощи в операциях сохранения диска, когда набор данных относительно велик, это может привести к остановке обслуживания сервера на сотни миллисекунд или даже на 1 секунду.
Конфигурация
Redis выгрузит снимок набора данных в файл dump.rdb. Кроме того, мы также можем изменить частоту создания снимков дампа сервера Redis через файл конфигурации. После открытия файла 6379.conf мы ищем сохранение и видим следующую информацию о конфигурации:
save 900 1 #Через 900 секунд (15 минут), если изменится хотя бы 1 ключ, сделать дамп снимка памяти.
save 300 10 #Через 300 секунд (5 минут), если поменялось хотя бы 10 ключей, сделать дамп снимка памяти.
save 60 10000 #Через 60 секунд (1 минуту), если поменялось хотя бы 10000 ключей, сделать дамп снимка памяти.
Во время выполнения команды bgsave только дочерний процесс fork будет блокировать сервер; для команды save сервер будет заблокирован весь процесс, поэтому сохранение в основном прекращено, и использование save должно быть исключено в онлайн-режиме; среда;
Метод сохранения AOF (добавление только файла)
принцип
Постоянство AOF записывает каждую операцию записи и удаления, обрабатываемую сервером, в виде журнала. Операции запроса не записываются, но записываются в текстовом виде. Вы можете открыть файл, чтобы просмотреть подробные записи операций.
Преимущество
Этот механизм может обеспечить более высокий уровень безопасности, то есть сохранение данных.
Предусмотрены три стратегии синхронизации.
Синхронизация каждую секунду
Посекундная синхронизация также является асинхронной операцией, которая очень эффективна. В случае сбоя в обслуживании будут потеряны только данные предыдущей секунды.
Синхронизируйте каждое изменение
Это можно понимать как синхронную инерционность и низкую эффективность.
Не синхронизировано
Поскольку этот механизм использует режим добавления для записи файлов журнала, даже если во время процесса записи произойдет простой, существующее содержимое файла журнала не будет уничтожено. Однако, если в этой операции мы запишем только половину данных и произойдет сбой системы, не волнуйтесь, прежде чем Redis запустится в следующий раз, мы можем использовать инструмент redis-check-aof, который поможет нам решить проблему согласованности данных.
Если журнал слишком велик, Redis может автоматически включить механизм перезаписи. То есть Redis непрерывно записывает измененные данные в старый файл на диске в режиме добавления. В то же время Redis также создает новый файл для записи того, какие команды модификации были выполнены в этот период. Таким образом, безопасность данных может быть лучше обеспечена при выполнении переключения перезаписи.
AOF содержит четко отформатированный и простой для понимания файл журнала для записи всех операций модификации. Фактически, мы также можем завершить реконструкцию данных с помощью этого файла.
недостаток
Для того же количества наборов данных файлы AOF обычно больше, чем файлы RDB. RDB быстрее, чем AOF, при восстановлении больших наборов данных.
В зависимости от стратегии синхронизации AOF часто работает медленнее, чем RDB, с точки зрения операционной эффективности. Короче говоря, эффективность стратегии синхронизации в секунду относительно высока, а эффективность стратегии отключения синхронизации столь же эффективна, как и RDB.
Конфигурация
В файле конфигурации Redis есть три метода синхронизации:
appendfsync всегда #Файл AOF будет записываться каждый раз, когда происходит изменение данных.
Appendfsync Everysec #Синхронизировать раз в секунду Эта политика является политикой AOF по умолчанию.
appendfsync no #Никогда не синхронизировать. Эффективно, но данные не будут сохранены.
Смешанный режим сохранения
redis4.0 начинает поддерживать этот режим
Решить проблему
Redis обычно загружает файлы AOF при перезапуске, но скорость загрузки низкая. Поскольку данные RDB неполны, загружается AOF. Метод открытия: aof-use-rdb-preamble true При включении AOF будет напрямую читать содержимое RDB при перезаписи.
Рабочий процесс
Завершается через bgrwriteaof. Разница в том, что при включении гибридного персистентности. 1 Дочерний процесс запишет данные из памяти в aof в форме RDB. 2. Запишите инкрементную команду из буфера перезаписи в файл в режиме AOF. 3. Замените старый файл AOF данными AOF, содержащими количество RDB и количество ячеек AOF. В новом файле AOF часть данных поступает из файла RDB, а часть — из инкрементальных данных во время работы Redis.
преимущество
Гибридное сохранение сочетает в себе преимущества сохранения RDB и сохранения AOF. Поскольку большинство из них имеют формат RDB, скорость загрузки высокая. В то же время в сочетании с AOF инкрементные данные сохраняются в режиме AOF и теряется меньше данных.
недостаток
Плохая совместимость. После включения гибридного сохранения файл AOF не распознается в версиях до 4.0. В то же время, поскольку первая часть имеет формат RDB, читаемость плохая.
Стойкость (двойное открытие)
В течение интервала времени, заданного RDB по умолчанию, если выполнено указанное количество операций записи, данные будут записаны на диск.
Подходит для крупномасштабного восстановления данных, согласованность и целостность данных плохие.
AOF каждую секунду добавляет журналы операций записи в файл AOF.
Файлы AOF большие, а целостность данных выше, чем у RDB.
Сравните с memcached
Все значения в memcached — это простые строки, а redis поддерживает более богатые типы данных.
Redis работает быстрее, чем Memcached, и может сохранять данные.
Применимая сцена
Кэш сеанса
Полностраничный кэш (FPC)
очередь
Таблица лидеров/Счетчик
публиковать/подписаться
Разница между Redis и Memcache
Memcached — это высокопроизводительная система кэширования объектов с распределенной памятью.
Единый кеш-ключ в памяти
Используется в динамических веб-приложениях для уменьшения нагрузки на базу данных и кэширования изображений, видео и т. д.
Redis — это база данных в памяти со структурой данных.
Поддержка сохранения и восстановления данных, позволяющая создавать единые точки отказа.
Богатые операции могут выполняться непосредственно на стороне сервера, чтобы сократить время ввода-вывода в сети и объем данных.
Java-клиент Redis
Латук
Клиент, используемый Springboot по умолчанию
Уровень связи, управляемый событиями, на основе платформы Netty, вызовы методов которой являются асинхронными.
Потокобезопасное синхронное, асинхронное и реактивное использование, поддержка кластеров, Sentinel, каналов и кодировщиков.
Редиссон
На основе реализации Netty, с использованием неблокирующего ввода-вывода, высокая производительность.
Поддержка асинхронных запросов
Поддержка пула соединений
Транзакции не поддерживаются
Поддерживает разделение чтения и записи и балансировку нагрузки чтения.
Может быть интегрирован с Spring Session для совместного использования сеансов на основе Redis.
Джедаи
Легкий, простой, легко интегрируется и модифицируется
Поддержка пула соединений
Поддерживает конвейерную обработку, транзакции, сценарии LUA, Redis Sentinel, Redis Cluster.
Разделение чтения и записи не поддерживается и должно быть реализовано самостоятельно.
Общая проблема
Почему Redis однопоточный?
Поскольку Redis — это операция, основанная на памяти, ЦП не является узким местом Redis.
Избегаются ненужные переключения контекста и состояния гонки, а также отсутствует многопроцессное или многопоточное переключение, потребляющее ресурсы ЦП.
Используйте модель многоканального мультиплексирования ввода-вывода, неблокирующий ввод-вывод.
Redis напрямую создал собственный механизм виртуальной машины.
Как обеспечить согласованность между Redis и базой данных
При обновлении сначала удалите кэш, а затем обновите базу данных.
При чтении сначала прочитайте кеш; если нет, прочитайте базу данных, поместите данные в кеш и верните ответ.
Установите время истечения срока действия кэша в особых обстоятельствах
Как реализовать распределенную блокировку в Redis
Значение ключа SET [EX секунды] [PX миллисекунды] [NX|XX]
EX секунда: установите время действия ключа на секунды.
NX: Устанавливайте ключ только в том случае, если ключ не существует.
Когда операция SET успешно завершена, возвращается OK, в противном случае возвращается ноль.
PX миллисекунда: установите время действия ключа в миллисекундах миллисекундах.
XX: Устанавливайте ключ только в том случае, если ключ уже существует.
Это безопасно только в единичном сценарии.
Несколько клиентов могут получить блокировку одновременно.
Асинхронное получение, исключение узла
Оптимизация памяти Redis
Оптимизация кодирования хранилища
Данные, хранящиеся в Redis, инкапсулируются с использованием структуры redisObject.
общий пул объектов
Относится к пулу целочисленных объектов [0-9999], который поддерживается внутри Redis для экономии памяти.
В дополнение к объектам целочисленных значений другие типы, такие как внутренние элементы list, hash, set и zset, также могут использовать пул целочисленных объектов.
Оптимизация строк
Контролируйте количество ключей и используйте хеш вместо нескольких значений ключей.
Уменьшите количество объектов «ключ-значение». Чем короче значение ключа, тем лучше.
Распространенные проблемы с производительностью Redis
Запретить мастеру запись снимков памяти
Сохранение основного AOF. Чрезмерное количество файлов AOF повлияет на скорость восстановления при перезапуске главного устройства.
Запретить мастеру вызывать BGREWRITEAOF для перезаписи файла AOF и вызвать кратковременную приостановку обслуживания.
Проблемы производительности репликации master-slave Redis
Для скорости репликации master-slave и стабильности соединения лучше всего, чтобы ведомое устройство и ведущее устройство находились в одной локальной сети.
Каковы стратегии устранения?
Летучие-lru: Из набора данных с установленным временем истечения срока действия.
Выберите самые последние и неиспользованные данные для публикации.
allkeys-lru: Из набора данных (включая набор данных с установленным сроком действия и не установленным сроком действия)
Выберите самые последние и неиспользованные данные для публикации.
летучий-случайный: из набора данных с установленным сроком действия
Случайным образом выберите фрагмент данных для публикации
allkeys-random: из набора данных (включая установленное и неустановленное время истечения срока действия)
Случайно выбрать фрагмент данных для публикации
Летучие-ttl: Из набора данных с установленным сроком действия.
Выберите данные, срок действия которых скоро истечет, и опубликуйте их.
noeviction: не удалять никакие данные (но Redis также освободит их на основе счетчика ссылок)
В это время, если памяти недостаточно, будет возвращена ошибка.
Как найти ключ с фиксированным префиксом из большого количества ключей
команда сочетания клавиш
Вернет все соответствующие ключи
Блокировка при запросе большого количества ключей повлияет на работающую службу, поскольку, когда объем данных, возвращаемых за один раз, относительно велик, служба будет работать с задержками.
Курсор SCAN [MATCH pttern] Команда [Count count]
SCAN — это список инструкций выборки в неблокирующем режиме, каждый раз возвращающий лишь небольшое количество элементов.
курсор относится к курсору, значение шаблона ПОИСКПОЗ является инструкцией, а параметр count указывает количество возвращаемых данных, но count не может строго контролировать это число.
scan 0 match k1* count 10 //Эта команда относится к высокой вероятности возврата данных счетчика, начиная с k1
Эта команда выполняет новые итерации только с 0 в качестве начальной точки курсора до тех пор, пока курсор, возвращаемый командой, не станет 0, то есть, когда возвращаемый курсор равен 0, это означает, что весь процесс итерации завершен.
Команда инкрементальной итерации SCAN не гарантирует, что каждое выполнение будет возвращать заданное количество элементов, которое может быть равно 0. Если курсор, возвращаемый командой, не равен нулю, приложение будет продолжать использовать предыдущий курсор для итерации до тех пор, пока значение курсора не станет равным нулю. равно 0. Для больших наборов данных одновременно могут быть возвращены десятки данных. Для меньших наборов данных все наборы данных могут быть возвращены напрямую.
Все пары команд, обнаруженные командой SCAN, могут иметь повторяющиеся значения, поэтому мы можем использовать хэш-набор для дедупликации данных.
Мемкеш
Структурная схема
Распределенное хранилище
МонгоБД
ФастДФС
Эластичный поиск
Полный кэш
Бинлог
Это решение для синхронизации данных «главный-подчиненный» для MySQL и большинства основных баз данных.
Другие платформы/базы данных кэширования
SSDB
РоксДБ
Очередь сообщений (MQ)
Кафка/Яфка
преимущество
Временная сложность O(1)
Высокий уровень ТПС
недостаток
Не поддерживает запланированные сообщения
Кафка Стримы
ActiveMQ
КроликMQ
преимущество
Высокий уровень параллелизма (вызванный особенностями реализации языка Erlang)
Высокая надежность и высокая доступность
недостаток
Тяжёлый вес
модель публикации-подписки
Модель публикации-подписки RabbitMQ
Обмен
Сообщения, отправленные производителями, могут отправляться только на коммутатор. Коммутатор решает, в какую очередь отправлять, а производитель не может решить.
временная очередь
queueDeclare() для создания непостоянной, проприетарной, автоматически удаляемой очереди со случайно сгенерированным именем.
Связывание
РакетаMQ
реализация языка Java
компоненты
сервер имен
маклер
режиссер
потребитель
Две модели потребления
ТЯНУТЬ
DefaultMQPullConsumer
ТОЛКАТЬ
По умолчаниюMQPushConsumer
преимущество
Высокая надежность данных
Поддерживает синхронную очистку диска, асинхронную очистку диска в реальном времени, синхронную репликацию и асинхронную репликацию.
Доставка сообщений в режиме реального времени
Повторите попытку сообщения поддержки
Высокий уровень ТПС
Одна машина записывает около 70 000 сообщений в секунду в один экземпляр TPS. При использовании 3 брокеров на одной машине максимальная скорость может достигать 120 000 сообщений в секунду. Размер сообщения составляет 10 байт.
Строгий порядок сообщений
Поддержка запланированных сообщений
Поддерживает возврат сообщений по времени.
Миллиарды сообщений накопились
недостаток
Процесс потребления должен быть идемпотентным (удаление дублирования)
НольMQ
преимущество
Высокий уровень ТПС
недостаток
Постоянные сообщения не поддерживаются.
Низкая надежность и доступность.
JMS
API
Фабрика соединений
Связь
Сессия
Место назначения
Производитель/потребитель сообщения
Состав сообщения
Заголовок сообщения
тело сообщения
Текстовое сообщение
КартаСообщение
БайтыСообщение
StreamMessage
ОбъектСообщение
Свойства сообщения
JMS надежный механизм
Сообщение считается успешно использованным только после его подтверждения. Потребление сообщения состоит из трех этапов: клиент получает сообщение, клиент обрабатывает сообщение и подтверждает сообщение.
транзакционная сессия
Сообщения автоматически отправляются после session.commit.
нетранзакционная сессия
режим ответа
АВТО_ПОДТВЕРЖДЕНИЕ
автоматическое подтверждение
CLIENT_ACKNOWLEDGE
textMessage.acknowledge() подтвердить сообщение
DUPS_OK_ACKNOWLEDGE
Отложенное подтверждение
Одноранговая сеть (режим P2P)
Публикация и подписка (режим Pub/Sub)
длительная подписка
непостоянная подписка
Промежуточное программное обеспечение базы данных
Подбаза данных и подтаблица
ШардингСфера
Схема архитектуры
SJDBC (шардинг-jdbc)
Моя кошка
другой
Диск
Кассандра
Neo4j
ИнфоГрид
Распределенная структура
Даббо
Весеннее облако
Накос
Аполлон
Disconf
Распределенная архитектура
сервисный компонент
Регистрационный центр
Работник зоопарка
модель данных
Тип узла
узел персистентности
Постоянные упорядоченные узлы
Временный узел
временный упорядоченный узел
Заказ
Создать узел
создать [-s] [-e] данные пути acl
Получить узел
получить путь [смотреть]
узлы списка
лс [путь]
Изменить узел
установить данные пути [версия]
Удалить узел
удалить путь [версия]
Применимая сцена
Центр публикации/конфигурации подписки
Реализация механизма наблюдателя
Внедрить централизованное управление информацией о конфигурации и динамическое обновление данных.
обнаружение службы
Распределенная блокировка
Реализация временных упорядоченных узлов и механизма наблюдения.
эксклюзивный замок
Реализация временного узла
общий замок
Реализация временного упорядоченного узла
Балансировка нагрузки
Запросы/данные распределяются по нескольким компьютерным блокам
Генератор идентификаторов
распределенная очередь
Единая служба именования
главные выборы
Проблем с расщеплением мозга можно избежать
Ограничение
Эурака
консул
Файловая система
НФС
FTP
Цеф
АВС С3
Грид-сервисы
Сервисная сетка
Линкерд
Истио
посланник
Динамическое обнаружение сервисов
Балансировка нагрузки
опрос
случайный
Минимально взвешенные запросы
Прекращение TLS
HTTP/2 и gRPC-прокси
предохранитель
Проверка работоспособности, выпуск оттенков серого на основе процентного разделения трафика
внесение неисправностей
Расширенные показатели
Смеситель
Контроль доступа
Используйте стратегию
Сбор данных
Пилот
обнаружение службы
Гибкое (тайм-аут, повторная попытка, автоматический выключатель и т. д.) управление трафиком
Интеллектуальная маршрутизация
Цитадель
Камбуз
посланник
nginmesh
Библиотека инструментов
Апач Коммонс
GoogleГуава
Ломбок
Библиотека манипуляций с байт-кодом
КАК М
Cglib
Явасист
Байтман
Байт Бадди
просмотрщик байт-кода
JSON
ФастДжсон
Гсон
Джексон
json-lib
Другие фреймворки
реактивная структура
Верт.x
асинхронная структура
Нетти
Плитка
Основной алгоритм
алгоритм консенсуса
Алгоритм балансировки нагрузки
Алгоритм ограничения тока
Распределенное планирование задач
Генерация распределенного идентификатора
Распределенная координация и синхронизация
алгоритм фильтра
Хэш-алгоритм
Приложение: проверка файлов, цифровая подпись, протокол аутентификации.
тип
MD5 (алгоритм дайджеста сообщения 5)
Алгоритм, используемый для обеспечения полной и последовательной передачи информации и вывода фиксированной длины 128 бит.
ША-1
Обычно используется для передачи HTTPS и подписи программного обеспечения.
ША-2
SHA-224/SHA-256/SHA-384/SHA-512 и стать SHA-2
ША-3
Ранее известный как алгоритм Кекчака, это криптографический алгоритм хеширования.
Проблемы и методы
Создавайте высокопроизводительные службы чтения
Данные в кэше фильтруются и сохраняются только в том случае, если они имеют деловое значение и будут запрошены.
Данные в кэше могут быть сжаты
Алгоритмы сжатия, такие как Gzip и Snappy.
Поля заменяются альтернативными идентификаторами во время сериализации JSON.
Redis использует хэш-структуру для хранения данных, вместо этого вы также можете использовать идентификаторы.
Асинхронное параллельное чтение
Создайте высокодоступную службу записи данных.
Шардинг базы данных/шардинг данных
Глобальный уникальный идентификатор
Генерируется случайным образом с использованием алгоритма
Создайте службу генерации идентификаторов на основе первичного ключа базы данных.
Промежуточное программное обеспечение подбиблиотеки
Моя кошка
Хранилище без сохранения состояния, вырезание базы данных в любой момент
Пишите случайным образом в зависимости от веса доступных библиотек.
После успешной записи данных в случайное хранилище данные активно записываются в кеш.
Полная синхронизация, время создания базы данных сканирования более 5 секунд (настраивается) и несинхронизированные данные.
Понижение кэша
Активно переходить к базе данных для выполнения полного запроса и сохранять запрошенное значение в кеше.
очередь сообщений
Может быть прочитано из кэша и асинхронно записано в базу данных.
Высокодоступная архитектура
Кэшируйте горячее резервное копирование на нескольких машинах, чтобы избежать потери кеша и других проблем.
Использование предварительного кэширования в приложении
Балансировка нагрузки
HAProxy
Нгинкс
сетевая модель
epoll (мультиплексированный ввод-вывод)
защита от понижения версии
Чтение и запись разделения
Разделение динамического и статического трафика
Как обеспечить согласованность гетерогенных данных
Многопоточность и параллелизм
Основные принципы
синхронизированный
Проблемы безопасности потоков
Существуют общие данные (также известные как автономные ресурсы).
Существует несколько потоков, работающих вместе для управления этими общими данными.
Решение: только одному потоку разрешено одновременно работать с общими ресурсами. Другие потоки должны дождаться завершения обработки потока, прежде чем они смогут работать с общими ресурсами.
Характеристики блокировки мьютекса
взаимная исключительность
Только одному потоку разрешено одновременно удерживать блокировку объекта. Благодаря этой функции реализуется механизм многопоточной координации, так что только один поток может получить доступ к блоку кода (составная операция), который необходимо синхронизировать одновременно. время. Взаимная исключительность также известна как атомарность операций.
видимость
Необходимо гарантировать, что изменения, внесенные в общую переменную до снятия блокировки, видны потоку, который впоследствии управляет этой переменной. То есть самое последнее значение общей переменной должно быть получено при получении блокировки, в противном случае - другой поток. сможет получить локальный доступ к общей переменной. Одна из кэшированных копий продолжает работать, что приводит к несогласованности.
Что синхронизируются блокировки - это не код, а объект.
Два способа получить блокировки объектов
синхронизированный блок кода
Синхронизированный блок кода, синхронизированный(это), синхронизированный(объект экземпляра), объект экземпляра в круглых скобках при блокировке
Синхронизированные нестатические методы
синхронизированный метод, текущий объект экземпляра заблокирован
По классификации эквайринговых замков
Получить блокировку объекта
синхронизированный блок кода
синхронизировано(это), синхронизировано(объект экземпляра класса), блокировка - это объект экземпляра в ()
Синхронизированные нестатические методы
синхронизированный метод блокирует экземпляр текущего объекта
Получить блокировку класса
Блок синхронизированного кода Synchroned(class.class) блокирует объект класса в круглых скобках.
Синхронизированный статический метод синхронизированный статический метод блокирует текущий объект класса (объект класса)
синхронизированный Основной принцип реализации
Расположение объектов в памяти
Заголовок объекта
Марк Мир
По умолчанию сохраняются хэш-код и возраст поколения хранимого объекта. Тип блокировки, флаг блокировки и другая информация.
Статус блокировки
Разблокированное состояние
легкий замок
Тяжелый замок
Маркировка GC
блокировка смещения
Адрес метаданных класса
Указатель типа указывает на метаданные класса объекта, и JVM использует этот указатель, чтобы определить, к какому классу принадлежит объект.
Данные экземпляра
Выровнять отступы
Что такое реентерабельность
Согласно конструкции блокировки мьютекса, когда поток пытается войти в критический ресурс блокировки объекта, удерживаемый другим потоком, он будет заблокирован. Когда поток снова запрашивает критический ресурс удерживаемой им блокировки объекта, эта ситуация является реентерабельной.
Почему вы насмехаетесь над синхронизацией?
В ранних версиях синхронизированная блокировка представляла собой тяжелую блокировку, реализация которой основывалась на Mutex Lock.
Переключение между потоками требует переключения из пользовательского режима в режим ядра, что требует больших затрат.
После Java6 синхронизированный Производительность значительно улучшилась
спин-блокировка
спин-блокировка
Во многих случаях состояние блокировки общих данных длится настолько недолго, что переключение потоков нецелесообразно.
Позволяя потоку выполнить цикл занятости и дождаться снятия блокировки, процессор не перестает работать.
Недостатки: Если блокировка занята другими потоками в течение длительного времени, это приведет к значительному снижению производительности.
Адаптивная блокировка вращения
Время отжима больше не фиксировано
Определяется предыдущим временем вращения на том же замке и статусом владельца замка.
устранение блокировки
Более тщательная оптимизация
Во время JIT-компиляции будет выполняться сканирование контекста для удаления блокировок там, где нет возможности конкуренции.
шероховатость замка
Избегайте повторных блокировок и разблокировок, расширив область действия замка.
Синхронизированная блокировка четырех состояний
нет замка
блокировка смещения
Сократите затраты на приобретение блокировок для одного и того же потока. В большинстве случаев не существует многопоточной конкуренции за ресурсы блокировки, и один и тот же поток всегда получает ресурс блокировки несколько раз.
Основная идея: если поток получает блокировку, блокировка переходит в смещенный режим, и структура Mark Word становится смещенной структурой. Когда поток снова запрашивает блокировку, нет необходимости выполнять какие-либо действия по синхронизации. То есть в процессе получения блокировки достаточно проверить бит метки блокировки слова метки, чтобы сместить блокировку, и идентификатор текущей блокировки. поток равен ThreadID слова метки. Это позволяет избежать необходимости выполнять большое количество операций приложения, связанных с блокировками.
легкий замок
Облегченные замки представляют собой модернизацию смещенных замков. Когда второй поток присоединяется к соревнованию по блокировкам, смещенная блокировка будет повышена до облегченной блокировки.
Адаптируйтесь к сценарию: потоки поочередно выполняют синхронизированные блоки кода. Если к одному и тому же замку осуществляется доступ одновременно, он превратится в тяжелый замок.
Тяжелый замок
синхронизированный и РинТрантЛок разница
Введение в Reentrant:Lock (реентерабельная блокировка)
Расположен в пакете j.U.C.
Реализовано на основе AQS, таких как CountDownLatch, FutureTask и Semaphore.
Возможность достижения более детального контроля, чем синхронизация, например, контроль справедливости.
После вызова lock() вы должны вызвать unlock(), чтобы разблокировать
Производительность может быть не выше синхронизированной, а также реентерабельной.
Настройки справедливости ReentrantLock
Создать пример справедливой блокировки ReentrantLock fairLock = новый ReetrantLock (истина);
Если параметр имеет значение true, блокировка, как правило, передается тому потоку, который ждал дольше всего.
справедливый замок
Порядок получения блокировок зависит от порядка вызова метода блокировки (используйте с осторожностью).
нечестная блокировка
Порядок упреждения не обязательно определен, он зависит от удачи.
Справедливая блокировка и несправедливая блокировка
синхронизировано — это несправедливая блокировка
ReentrantLock объективирует блокировки
Определите, есть ли поток или конкретный поток, ожидающий в очереди получения блокировки.
Попытка получить блокировку с таймаутом
Определите, успешно ли получен замок.
Можно ли объективировать wait/notify/notifyAll?
java.util.concurrent.locks.Условие
ArrayBlockingQueue — это потокобезопасная ограниченная блокирующая очередь, реализованная базовым массивом.
Подведем итог
синхронизировано — ключевое слово, ReentrantLock — класс
ReentrantLock может установить время ожидания получения блокировки, чтобы избежать взаимоблокировки.
ReentrantLock может получать информацию о различных блокировках
ReentrantLock может гибко реализовать несколько уведомлений
Механизм: синхронизация работает со словом Mark заголовка объекта, а блокировка вызывает метод park() класса Unsafe.
видимость памяти jmm
Что такое Ява в модели памяти случиться-раньше
Джава из Память Модель ДММ
Модель памяти Java (сокращенно JMM) сама по себе является абстрактной концепцией и на самом деле не существует. С помощью этого набора спецификаций определяется каждая переменная программы (включая поля экземпляра). и элементы, составляющие объект массива).
Основная память в JMM
Хранить объекты экземпляра Java
Включая переменные-члены, информацию о классе, постоянное освещение, статические переменные и т. д.
Принадлежит к области совместного использования данных, что может вызвать проблемы с безопасностью потоков при одновременном выполнении многопоточных операций.
Рабочая память JMM
Сохраняет всю информацию о локальных переменных текущего метода. Локальные переменные не видны другим потокам.
Индикатор номера строки байт-кода, информация о собственном методе
Он принадлежит к области личных данных потока и не имеет проблем с безопасностью потоков.
Разделение областей памяти JMM и Java — это разные концептуальные уровни.
JMM описывает набор правил, которые основаны на атомарности, упорядоченности и видимости.
Сходства: есть общие и частные зоны.
Краткое изложение типов хранения данных и методов работы основной и рабочей памяти
Локальные переменные базового типа данных в методе будут храниться непосредственно в структуре кадра стека рабочей памяти.
Локальные переменные ссылочного типа: ссылка хранится в рабочей памяти, а экземпляр — в основной памяти.
Переменные-члены, статические переменные и информация о классе будут храниться в основной памяти.
Метод совместного использования основной памяти заключается в том, что каждый поток копирует копию данных в рабочую память и обновляет ее обратно в основную память после завершения операции.
ДММ Как решить проблема с видимостью памяти
Условия, которые необходимо выполнить для изменения порядка инструкций
Результаты операции невозможно изменить в однопоточной среде.
Изменение порядка не допускается, если существуют зависимости данных.
То есть переупорядочить можно только те инструкции, которые не могут быть выведены по принципу «случилось раньше».
Если операция по устранению недостатков A требует наличия обучающего программного обеспечения для операций B, то A и B имеют отношения «случилось до того».
случиться-раньше в принципе
Основная основа для оценки того, существует ли конкуренция в данных и безопасен ли поток
правила порядка программы
В потоке, в соответствии с порядком кода, операции, написанные спереди, выполняются раньше операций, написанных сзади.
Правила блокировки
Операция разблокировки происходит перед последующей операцией блокировки того же замка.
правила изменчивых переменных
Операция записи в переменную происходит перед последующей операцией чтения этой переменной.
Правила доставки
Если операция А происходит до операции Б, а операция Б происходит до операции С, то можно сделать вывод, что операция А происходит до операции С.
Правила запуска темы
Метод start() объекта Thread выполняется первым для каждого действия этого потока.
Правила завершения потока
Вызов метода прерывания() потока происходит сначала после того, как код прерванного потока обнаруживает возникновение события прерывания.
Правила завершения потока
Все операции в потоке сначала выполняются, когда поток завершается. Мы можем определить, что поток завершился, с помощью метода Thread.join() и возвращаемого значения Thread.isAlive().
Правила финализации объекта
Инициализация объекта происходит сначала в начале его метода Finalize().
Если две операции не удовлетворяют ни одному из вышеперечисленных правил «происходит до», то порядок этих двух операций не гарантируется, и JVM может изменить порядок этих двух операций;
Если операция A происходит до операции B, то операции, выполняемые в памяти операцией A, видны операции B.
изменчивый
Облегченный механизм синхронизации, предоставляемый JVM.
Убедитесь, что общие переменные, измененные с помощью Летучего, всегда видны всем потокам.
Отключить оптимизацию переупорядочения инструкций
Volatile не гарантирует безопасность в многопоточных ситуациях.
Не потокобезопасно
Безопасность резьбы
Безопасность резьбы
Волатильные переменные и почему они сразу видны
При записи изменчивой переменной JMM обновит значение общей переменной в рабочей памяти, соответствующее потоку, в основную память.
При чтении изменчивой переменной JMM аннулирует рабочую память, соответствующую потоку.
изменчивый, например отключение оптимизации переупорядочения
Барьер Памяти
Гарантировать порядок выполнения конкретных операций
Гарантировать видимость в памяти определенных переменных
Отключите оптимизацию переупорядочения для инструкций до и после барьера памяти, вставив барьер памяти.
Принудительно очищает кэшированные данные для различных процессоров, чтобы потоки на любом процессоре могли читать последнюю версию этих данных.
Реализация двойного обнаружения синглтона
Используйте Volatility, чтобы отключить оптимизацию переупорядочения
Разница между энергозависимыми и синхронизированными
Суть voluty заключается в том, чтобы сообщить JVM, что значение текущей переменной в регистре (рабочей памяти) является неопределенным и его необходимо прочитать из основной памяти. Синхронизация блокирует текущую переменную. Только текущий поток может получить доступ к переменной. и другие потоки блокируются до тех пор, пока они не узнают значение, пока поток не завершит операцию с переменной.
Volatile можно использовать только на уровне переменной, а Synchronized — на уровне переменной, метода и класса.
Volatile может реализовать только видимость модификаций переменных, но не может гарантировать атомарность, тогда как синхронизированный может гарантировать видимость и атомарность модификаций переменных.
Летучий не приведет к блокировке потока; Synchronized может вызвать блокировку потока.
Переменные, помеченные как flaming, не будут оптимизированы компилятором; переменные, помеченные как синхронизированные, могут быть оптимизированы компилятором.
Технология CAS без блокировки (Сравнить и поменять местами)
синхронизированный — пессимистичный замок, CAS — оптимистичный дизайн замка
Эффективный способ обеспечить потокобезопасность
Поддерживает операции атомарного обновления, подходит для счетчиков, секвенсоров и других сценариев.
Это оптимистичный запорный механизм, известный как безблокировочный.
Считается, что на нижнем уровне все еще существует блокировка.
Если операция CAS завершается неудачей, разработчик решает, продолжать попытки или выполнить другие операции.
Так его не заблокируют и не зависнут
CAS подумал
Содержит три операнда
Ячейка памяти (V)
Ожидаемая первоначальная стоимость (А)
новое значение (Б)
При выполнении операции CAS значение ячейки памяти будет сравниваться с ожидаемым исходным значением. Если они равны, процессор автоматически установит значение ячейки на новое значение, в противном случае процессор не будет выполнять никакой обработки. Значение ячейки памяти соответствует значению основной памяти.
CAS в большинстве случаев прозрачен для разработчиков.
Атомарный пакет J.U.C предоставляет часто используемые атомарные типы данных, а также связанные с ними атомарные типы, такие как ссылки и массивы, а также инструменты операций обновления. Это лучший выбор для многих потокобезопасных программ.
Хотя класс Unsafe предоставляет службы CAS, он таит в себе скрытые опасности, поскольку может произвольно манипулировать адресами памяти для чтения и записи, поэтому его нелегко реализовать вручную.
Вы должны вызвать Unsafe. После Java 9 для замены Unsafe предоставляется Variable Handke API.
Недостатки CAS
Если время слабого цикла велико, накладные расходы будут высокими.
Гарантируются только атомарные операции с общей переменной.
проблема ABA
Если значение переменной равно A, но было изменено на B другим потоком в течение этого периода, а затем снова изменено на A, операция CAS будет считать, что значение не было изменено в данный момент.
Решение. Предоставляет версию управляющей переменной AtomicStampedeReference для решения проблемы ABA в CAS.
процесс
мульти-Прогресс
Функции
Изоляция памяти: исключение в одном процессе не приведет к сбою всего приложения, что упрощает отладку.
Межпроцессные вызовы, связь и коммутация стоят дорого.
Часто используется в сценариях с небольшим взаимодействием между целевыми подфункциями, слабой корреляцией и масштабируемостью для распределения на нескольких машинах (балансировка нагрузки Nginx).
Классификация процессов
демон
Daemon Thread (поток демона)
Предоставлять услуги для запуска других потоков
поток GC
процесс, не являющийся демоном
Пользовательская тема (пользовательская тема)
Как создать процесс
Используйте метод exec(String cmdarray[]) среды выполнения для создания экземпляра виртуальной машины.
Любой процесс будет выполняться только на одном экземпляре виртуальной машины (исходный код использует одноэлементный режим).
Создайте процесс операционной системы, используя метод start() ProcessBuilder.
Разница между процессом и потоком
Процесс/процесс
это сущность программы
Программа — это описание инструкций, данных и их организации.
Это работа программы на компьютере с определенным набором данных.
Это базовая единица распределения ресурсов и планирования в системе.
Это основа структуры операционной системы.
Является контейнером для потоков
Характеристики процесса
независимость
Динамический
Параллелизм
Запускаем компьютер, текстовый редактор и т.п. через процесс
нить
Он существует в зависимости от процесса. Каждый поток должен иметь родительский процесс.
Поток имеет собственный стек, счетчик программ и локальные переменные, а также разделяет системные ресурсы процесса с другими потоками.
Процессы не могут совместно использовать память, тогда как потоки могут легко делиться памятью друг с другом.
Основы темы
Отношения родитель-потомок потока
Создание потока должно быть завершено другим потоком
Родительским потоком созданного потока является поток, который его создал.
Создать тему
Реализуйте метод запуска интерфейса Runnable.
Переопределить метод run класса Thread
демонический поток
присоединение к потоку
прерывание функция прерывания
1. Вызовите прерывание(), чтобы уведомить поток о том, что его следует прервать.
Если поток заблокирован, он немедленно выйдет из заблокированного состояния и выдаст InterruptedException.
Текущее использование
Вызываемый поток должен взаимодействовать с прерыванием
При обычном выполнении задач вам необходимо часто проверять бит флага прерывания этого потока. Если флаг прерывания установлен, остановите поток самостоятельно.
Если он находится в нормальном активном состоянии, установите бит флага прерывания потока в значение true, и установленный поток будет работать нормально без каких-либо изменений.
Разница между Thread и Runable
Runable — это интерфейс
Thread — это класс, реализующий интерфейс Runable.
Из-за принципа единого наследования классов рекомендуется использовать интерфейс Runnable.
Разница между сном и ожиданием
спать()
Поток.сон()
Метод сна можно использовать где угодно
Режим сна только откажет процессор и не приведет к изменению поведения блокировки.
ждать()
Объект.wait()
wait можно использовать только в синхронизированных методах или синхронизированных блоках кода.
Не только освобождает ЦП, но и снимает занятую в данный момент блокировку ресурса синхронизации.
Разница между notify и notifyAll
Блокировка пула и пул ожидания
замковый пул
Предположим, что поток A уже владеет блокировкой объекта (нет), а другие потоки B и C хотят вызвать синхронизированный метод или синхронизированный блок кода этого объекта, поскольку потоки B и C должны войти в синхронизированный метод (или блок кода). объекта, удерживайте право собственности на блокировку объекта. В это время блокировка удерживается A, затем потоки B и C будут заблокированы и войдут в место ожидания снятия блокировки. Это место принадлежит объекту. замковый бассейн.
жду, чтобы поесть
Предположим, что поток A вызывает метод объекта wait(). Поток A снимает блокировку объекта. В это время поток A войдет в пул ожидания объекта. Потоки, входящие в пул ожидания, не будут конкурировать за блокировку объекта.
поставить в известность
Поток в пуле ожидания будет случайно выбран для входа в пул блокировок и борьбы за возможность получить блокировку.
уведомитьВсе
notifyAll приведет к тому, что все потоки в пуле ожидания войдут в пул блокировок, чтобы конкурировать за возможность получить блокировку.
функция назначения доходности
Когда вызывается функция Thread.yield(), она дает планировщику потоков подсказку, указывающую, что текущий поток готов отказаться от процессора, но планировщик потоков может игнорировать эту подсказку.
Статус темы
новый новый
Статус потока, который еще не был запущен после создания
Способ входа: после нового, перед стартом
исполняемый может работать
Работает/Готов
Выполнение: состояние потока, когда планировщик потоков выбирает поток из исполняемого пула в качестве текущего потока.
Состояние потока, когда планировщик потоков выбирает поток из исполняемого пула в качестве текущего потока. Это также единственный способ перехода потока в рабочее состояние.
Состояние потока, когда планировщик потоков выбирает поток из исполняемого пула в качестве текущего потока.
1. Состояние готовности означает только то, что вы имеете право на участие. Если планировщик не выберет вас, вы всегда будете в состоянии готовности. 2. Вызовите метод start() потока, и поток перейдет в состояние готовности. 3. Завершается метод Sleep() текущего потока, а также завершается метод join() других потоков. После завершения пользовательского ввода поток получает блокировку объекта, и эти потоки также переходят в состояние готовности. 4. Когда интервал времени текущего потока исчерпан, вызывается метод yield() текущего потока, и текущий поток переходит в состояние готовности. 5. Когда квант времени потока будет исчерпан, вызовите метод yeid() текущего потока, и текущий поток перейдет в состояние готовности. 6. После того как поток в пуле блокировок получит блокировку объекта, он переходит в состояние готовности.
заблокирован заблокирован
Ожидание получения эксклюзивной блокировки
ожидание бесконечное ожидание
Не будет выделено время выполнения ЦП, и его необходимо явно разбудить.
Ожидание по времени Ожидание по времени
Система автоматически проснется через некоторое время.
прекращено
Статус «Завершено», поток завершил работу
1. Когда завершается выполнение метода run потока или завершается выполнение основной функции, мы думаем, что поток завершается. Этот объект потока может быть живым, но он больше не является отдельно выполняющимся потоком. После завершения потока его невозможно возобновить. 2. Вызов метода start в завершенном потоке вызовет исключение java.lang.IllegalThreadStateExecption.
Многопоточность
Смысл многопоточности
Получите максимальную отдачу от вашего процессора
Как создать тему
Наследовать класс Thread
Реализовать интерфейс Runnable
Избегайте ограничений множественного наследования
Может лучше отразить концепцию обмена
Реализация интерфейса Callable
Запустить многопоточность через пул потоков
В чем разница между runnable и callable
Метод запуска Runnable интерфейса не имеет возвращаемого значения
Может генерировать только исключения во время выполнения и не может их перехватить.
Вызываемый метод вызова интерфейса имеет возвращаемое значение и поддерживает дженерики.
Разрешить создание исключений и получение информации об исключениях
Как взаимодействовать с информацией
недействительное уведомление()
Случайным образом пробуждает один поток, ожидающий пула ожидания этого объекта (монитора), и входит в пул блокировок.
недействительный уведомитьВсе()
Разбудите все потоки, ожидающие в пуле ожидания этого объекта (мониторе), и войдите в пул блокировок.
недействительное ожидание()
Заставляет текущий поток ждать, пока другие потоки не вызовут метод notify() или метод notifyAll() этого объекта.
недействительное ожидание (длительный тайм-аут)
То же, что указано выше, или превышает указанное время.
void wait (длинный тайм-аут, int nanos)
То же, что и выше, или какой-либо другой поток прерывает текущий поток.
ДММ
атомарность
Характеристика, заключающаяся в том, что одна или несколько операций не прерываются во время работы ЦП.
Атомарные классы, начинающиеся с Atomic
Принцип CAS
AtomicLong >> LongAdder
AtomicLong основан на обновлении спина CAS.
LongAdder делит значение на несколько ячеек
видимость
Изменения общих переменных одним потоком могут быть немедленно видны другому потоку.
изменчивый
упорядоченность
выполнение программы чтобы Закодированный Выполнять последовательно
Происходит до правила
правила порядка программы
Внутри потока, в соответствии с последовательностью выполнения программы, операции, записанные в начале, выполняются раньше операций, записанных в конце.
Мониторинг правил блокировки
Операция разблокировки происходит перед последующей операцией блокировки того же замка.
Правила нестабильных переменных
Операция записи в изменчивую переменную происходит перед последующей операцией чтения этой переменной.
Правила запуска темы
Метод start() объекта Thread выполняется первым для каждого действия этого потока.
Правила завершения потока
Все операции в потоке происходят в первую очередь после обнаружения завершения этого потока.
Правила прерывания потока
Вызов метода прерывания() потока происходит сначала после того, как код прерванного потока обнаруживает возникновение события прерывания.
Правила финализации объекта
Завершение инициализации объекта (окончание выполнения конструктора) происходит сначала в начале его метода Finalize().
Локальное хранилище потока ThreadLocal
Каждый поток может получить доступ к значению в своем собственном внутреннем объекте ThreadLocalMap.
Например: Каждому потоку назначается соединение JDBC. Соединение.
Пул потоков
Используйте исполнителей для создания разных пулов потоков для удовлетворения потребностей разных сценариев.
newFixedThreadPool (int nThreads)
Пул потоков с указанным количеством рабочих потоков
новыйCachedThreadPool(
Пул потоков для обработки большого количества кратковременных рабочих задач.
Попытки кэшировать потоки и повторно использовать их; когда кэшированные потоки недоступны, создаются новые рабочие потоки.
Если поток простаивает дольше порогового значения, он будет завершен и удален из кэша.
Когда система простаивает в течение длительного времени, ресурсы не потребляются.
новыйSingleThreadPool()
Создайте уникальный рабочий поток для выполнения задачи. Если поток завершается ненормально, его заменит другой поток.
newSingleThreadScheduledExecutor() и newScheduledThreadPool(int corePoolSize)
Тайминг или периодическое планирование работы, разница заключается в одном рабочем потоке или нескольких потоках.
новыйWorkStealingPool()
ForkJoinPool будет построен внутри компании с использованием алгоритма перехвата работы для параллельной обработки задач, и обработка не гарантируется.
Фреймворк fork/jion
Платформа параллельных задач, предоставляемая Java7
Структура, которая делит большую задачу на несколько мелких задач и выполняет их параллельно и, наконец, суммирует результаты каждой маленькой задачи для получения результатов большой задачи.
алгоритм кражи работы
Поток крадет задачи из других очередей для выполнения
Fork разделит задачи на разные очереди и создаст отдельные потоки для выполнения каждой очереди.
Когда поток завершает выполнение своей собственной очереди задач, он перехватывает задачи из очереди других потоков для выполнения.
Очередь принимает двустороннюю очередь. Украденный поток всегда берет задачу из начала двусторонней очереди, а украденный поток всегда берет задачу из хвоста двусторонней очереди.
Фреймворк исполнителя
Это структура, которая разделяет отправку задач и их выполнение.
Три интерфейса Executor от J.U.C.
Исполнитель
Простой интерфейс для запуска новых задач с подробностями отправки и выполнения задач.
ИсполнительСервис
В нем есть методы управления исполнителями и циклами объявления задач, а механизм отправки задач более совершенен.
ЗапланированныйExecutorService
Поддержка будущих и регулярно выполняемых задач
Конструктор ThreadPoolExecutor
corePoolSize
Количество основных потоков
Максимальный размер пула
Максимальное количество потоков, которое можно создать, если потоков недостаточно.
работаОчередь
Очередь ожидания задач
KeepAliveTime
Помимо количества основных потоков, время выживания других потоков, когда они простаивают
Порядок упреждения не обязательно определен, он зависит от удачи.
ThreadFactory
Создать новую тему
По умолчанию используется Executors.defaultThreadFactory.
обработчик
стратегия насыщения
Политика прерывания
Вызов исключения напрямую, это стратегия по умолчанию.
CallerRunsPolicy
Используйте поток вызывающего абонента для выполнения задачи
Отбросить старую политику
Отменить верхнюю задачу в очереди
политика сброса
Отменить задачу напрямую
Реализуйте собственный обработчик интерфейса RejectedExecutionHandler для удовлетворения собственных бизнес-потребностей.
Решение после отправки новой задачи на выполнение
Если запущено меньше потоков, чем corePoolSize, для обработки задач будут созданы новые потоки, даже если другие потоки в пуле потоков простаивают.
Если количество потоков, полученных в пуле потоков, больше или равно corePoolSize и меньше, чем MaximumPoolSize, новый поток будет создан для обработки только тогда, когда workQueue заполнен. В противном случае workQueue будет заполнен.
Если заданные значения corePoolSize и MaximumPoolSize одинаковы, размер созданного пула потоков фиксирован. В это время, если новая задача отправлена, а workQueue не заполнена, задача будет помещена в workQueue и будет ждать, пока простаивающий поток извлечет обработку задачи из workQueue.
Если количество запущенных потоков больше или равно maximunPoolSize и если очередь workQueue заполнена Задача обрабатывается посредством стратегии, сформулированной обработчиком.
Статус пула потоков
БЕГ
Способен принимать новые задачи и обрабатывать задачи в рабочей очереди.
ВЫКЛЮЧЕНИЕ
Новые задачи больше не принимаются, но существующие задачи можно обрабатывать.
ОСТАНАВЛИВАТЬСЯ
Новые задания больше не будут приниматься, а существующие задания выдаваться не будут.
УБОРКА
Все задачи прекращены
ПРЕКРАЩЕНО
завершено(), войдите в это состояние после выполнения метода
Жизненный цикл рабочего потока
Зачем использовать пул потоков
Уменьшите потребление ресурсов
Улучшение управления потоками
Как выбрать размер пула потоков
интенсивный процессор
Количество потоков = устанавливается в зависимости от количества ядер или количества ядер 1.
Интенсивный ввод-вывод
Количество потоков = количество ядер ЦП * (1 среднее время ожидания / среднее время работы)
исполнитель потока исполнитель
состояние
Фреймворк исполнителя
Исполнители
новыйFixedThreadPool
Пул потоков фиксированной длины создает поток каждый раз при отправке задачи, пока не будет достигнуто максимальное количество пулов потоков.
новыйScheduledThreadPool
Пул потоков фиксированной длины, который может выполнять периодические задачи.
Возможность планировать запуск команд после заданной задержки или периодически по мере необходимости.
новыйCachedThreadPool
Кэшируемый пул потоков: если емкость пула потоков превышает количество задач, простаивающие потоки будут автоматически перезапущены.
Новые потоки могут добавляться автоматически при увеличении задач, а емкость пула потоков не ограничена.
новыйSingleThreadExecutor
В однопоточном пуле потоков, если поток завершается ненормально, будет создан новый поток, чтобы гарантировать выполнение задач в том порядке, в котором они были отправлены.
новыйSingleThreadScheduledExecutor
Однопоточный пул потоков, который может выполнять периодические задачи.
новыйWorkStealingPool
Задачи крадут пул потоков и не гарантируют порядок выполнения, который подходит для задач с большой разницей во времени.
Создаваемый по умолчанию параллельный уровень — это количество ядер ЦП. Когда основной поток завершается, даже если в пуле потоков есть задачи, он немедленно останавливается.
ForkJoinTask
Решить проблему дисбаланса загрузки процессора
Получите максимальную отдачу от многоядерных процессоров, используя принцип «разделяй и властвуй».
Сегментация задач
Результаты объединены
ThreadPoolExecutor Базовый класс пула потоков
corePoolSize
Количество основных потоков
Максимальный размер пула
Максимальное количество потоков
KeepAliveTime
Время выживания потока в режиме ожидания
единица
единица времени выживания
работаОчередь
Очередь блокировки задач
ThreadFactory
Требуется Factory при создании нового потока
обработчик
Запретить политику
Политика прерывания
По умолчанию, когда очередь заполнена, задачи отбрасываются и создается исключение.
Политика сброса
Если очередь заполнена, задача будет отменена без создания исключения.
Отбросить старую политику
Удалите самую раннюю задачу, попавшую в очередь, а затем повторите попытку присоединиться к очереди.
CallerRunPolicy
Если добавление в пул потоков не удалось, основной поток сам выполнит задачу.
Четыре стратегии отказа
SecheduleThreadPoolExecutor
В основном используется для запуска задач после заданной задержки или задач, которые выполняются регулярно.
Служба выполнения экзекторкомплементион
Внутренне управляет блокирующей очередью выполненных задач.
представлять на рассмотрение()
Отправьте задачу, и в конечном итоге она будет делегирована внутреннему исполнителю для выполнения задачи.
Параметры (Runnable) или (Runnable и результат T) или (Callable)
Возвращаемое значение Будущее При вызове метода get вы можете перехватывать и обрабатывать исключения.
брать()
Если в очереди блокировки уже есть выполненная задача, верните результат задачи, в противном случае заблокируйте и дождитесь завершения задачи.
голосование()
Возвращает, если в очереди есть выполненная задача, в противном случае возвращает ноль
pull(длинный,TimeUnit)
Если в очереди есть задача, которая выполнена, вернуть результат задачи, в противном случае дождаться указанного времени, Если задача по-прежнему не завершена, верните ноль
Фреймворк fork/join
ФоркДжоинПул
Это дополнение к ExecutorService, а не замена. Он особенно подходит для алгоритмов «разделяй и властвуй» и рекурсивных вычислений.
Рекурсивтаск
Задачи, которые возвращают результаты
РекурсивноеДействие
Расчеты, которые не возвращают результатов
структура потока
ЮК
【Пакет разработки java.util.concurrent】
основной класс
Класс инструмента TimeUnit
Класс фабрики потоков ThreadFactory
КАС
Является основой пакета java.util.concurrent.autimic.
атомарный (класс атомарных переменных)
Атомный класс построен на основе CAS, а CAS является широко используемой реализацией неблокирующих алгоритмов. По сравнению с блокирующими алгоритмами, такими как синхронизированный, он имеет более высокую производительность.
Обычный атомный класс
АтомныйBoolean
AtomicLong
Атомное целое число
АтомныйЦелыйМассив
AtomicLongArray
Ссылочный класс атома
Атомная ссылка
Атомная ссылкаМассив
Решите АВА
Атомная маркируемая ссылка
AtomicStampedReference
Расширенный класс атома
Длинный аккумулятор
Конструктор индивидуально реализованного длинного аккумулятора принимает интерфейс бинокулярного оператора и возвращает вычисленное значение на основе двух входных параметров. Другой параметр — это начальное значение аккумулятора.
Двойной Аккумулятор
Специально реализованный аккумулятор двойного типа, такой же, как LongAccumulator.
ЛонгАддер
Атомарные операции типа long лучше справляются с параллелизмом, чем LongAtomic, и их следует использовать в первую очередь. LongAdder — это особый случай LongAccumulator.
ДаблАддер
Атомарные операции двойного типа, такие же, как LongAdder
основные компоненты
механизм замка
Замок
ЧтениеЗаписьБлокировка
AQS (синхронизатор очереди)
Это пакет java.util.concurrent.locks, а также основа некоторых распространенных классов, таких как Semophore и ReentratLock.
AbstractOwnableSynchronizer (эксклюзивная блокировка)
Для реализации блокировок и корреляций, основанных на очередях ожидания FIFO в порядке очереди. Синхронизаторы <семафоры, события и т. д.> обеспечивают основу
AbstractQueuedLongSynchronizer (64-битный синхронизатор)
Блокировка мьютекса ReentrantLock
ReadWriteLock блокировка чтения и записи
Очередь контроля состояния
Блокирующий примитив LockSupport
Семафор семафор
Защелка CountDownLatch
ЦиклическийБарьерный забор
Переключатель обменника
Обратный вызов потока CompletableFuture
Параллельные коллекции
параллельная очередь
МассивБлокированиеОчередь
Ограниченная блокирующая очередь структуры массива
LinkedBlockingDueue
Блокирующая очередь со структурой связанного списка. Если размер не указан, она является неограниченной.
LinkedBlockingQueue
Двусторонняя блокирующая очередь со структурой связанного списка. Если размер не указан, она не ограничена.
ПриоритетБлокировкаОчередь
Очередь блокировки с ограничением приоритета структуры массива, сортировка кучи
DelayQueue
очередь отложенной блокировки
PriorityQueue используется внутри для реализации задержки.
Синхронная очередь
Очередь синхронной блокировки не имеет емкости, и операция размещения всегда будет блокироваться. Выполнение не может продолжаться до тех пор, пока не будет выполнена операция Take.
LinkedTransferQueue
Объединение SychronousQueue и LinkedBlockingQueue Неограниченная очередь блокировки
Очередь блокировки BlockQueue обеспечивает блокировку операций постановки и удаления из очереди. В основном используется в режимах производителя и потребителя. В случае многопоточности Производитель добавляет элементы в конец очереди. Потребитель потребляет элементы в начале очереди. Для достижения цели изоляции генерации и потребления задач
ConcurrentLinkedDeque
Потокобезопасная очередь со структурой связанного списка
ConcurrentLinkedQueue
Потокобезопасная двунаправленная очередь со структурой связанного списка
неблокирующая очередь
одновременный сбор
ConcurrentHashMap
Потокобезопасная карта, массив, связанный список/красно-черная древовидная структура
ConcurrentHashMap.newKeySet()
Потокобезопасные операции
ConcurrentSkipListMap
Потокобезопасность, карта отсортирована по ключу, структура списка пропусков
Конкурентскиплистсет
Потокобезопасность, упорядоченный набор, структура списка пропуска
КопироватьонзаписьArrayList
Напишите, чтобы скопировать Список, сценарий больше читать и меньше писать
КопироватьОнWriteArraySet
Набор копируется при написании, сценарий чтения больше и записи меньше
Инструменты параллелизма
Обратный отсчетЗащелка
Блокировка позволяет одному потоку дождаться завершения работы других потоков, прежде чем продолжить выполнение.
ЦиклическийБарьер
Ограждения позволяют нескольким потокам ожидать выполнения условия, прежде чем продолжить выполнение.
Семафор
Семафор, счетный семафор, который должен быть освобожден получившим его потоком, часто используется для ограничения количества потоков, которые могут получить доступ к определенным ресурсам.
Обменник
Exchanger — инкапсулированный класс инструментов, используемый для обмена данными между двумя рабочими потоками.
другой
Единица времени
ThreadLocalСлучайный
Улучшена производительность генерации случайных чисел при многопоточности, чтобы избежать конкуренции за одно и то же начальное число.
Потокобезопасность и синхронизация данных
Обратный отсчетЗащелка
Заставьте поток или потоки подождать
Семафор
Вспомогательный класс для синхронизации потоков, который может поддерживать количество потоков, которые в данный момент обращаются к себе, и обеспечивать синхронизацию.
ЦиклическийБарьер
Реализуйте группу потоков, которые будут ждать друг друга, а затем выполнять последующие операции, когда все потоки достигнут определенной точки барьера.
изменчивый
эффект
Может действовать только с переменными
Указывает, что переменная не определена в регистре ЦП и должна быть прочитана из основной памяти.
Функции
Обеспечьте видимость
Нет гарантии атомарности
Отключить перестановку команд
блокировка потока
Замок
Классификация уровней
нет замка
блокировка смещения
легкий замок
Тяжелый замок
причина
крестовый замок
Недостаточно места
блокировка базы данных
Обмен данными в формате вопросов и ответов
бесконечная петля
тупик
Четыре необходимых условия
Взаимоисключающие условия
Определенный ресурс занят только одним потоком в течение определенного периода времени, а другие потоки, запрашивающие этот ресурс, могут только ждать.
нет условий депривации
Ресурсы, полученные потоком, не могут быть принудительно отняты другими потоками до того, как они будут полностью использованы.
Активно его может освободить только поток, получивший ресурс.
Условия запроса и удержания
Поток уже содержит хотя бы один ресурс, но делает запрос нового ресурса.
Ресурс уже занят другими потоками, а запрашивающий поток в это время заблокирован.
Держитесь за ресурсы, которые вы приобрели
Условие ожидания цикла
Существует циклическая цепочка ожидания для ресурсов потока.
Ресурсы, полученные каждым потоком, одновременно запрашиваются следующим потоком в цепочке.
Способы избежать тупика
Порядок блокировки
Потоки фиксируются в определенном порядке
Ограничение времени блокировки
Добавьте определенный лимит времени, когда поток пытается получить блокировку.
Если лимит времени превышен, запрос на блокировку будет отклонен, а удерживаемая блокировка будет снята.
Обнаружение тупиковой ситуации
диагноз
jstack
jvisualvm
спин-блокировка
Поток неоднократно проверяет, доступна ли переменная блокировки.
Блокировка TicketLock в основном решает проблему справедливости.
Блокировка CLH — это масштабируемая, высокопроизводительная и справедливая блокировка на основе связанного списка.
MCSLock перебирает узлы локальных переменных
CAS-реализация
CAS имеет 3 операнда: значение памяти V, старое ожидаемое значение A и новое значение, подлежащее изменению B.
Если и только если ожидаемое значение A и значение памяти V одинаковы, измените значение памяти V на B, в противном случае ничего не делайте.
Углубленные принципы
Билет CAS
Оптимизация блокировки
JVM-оптимизация
Направление оптимизации — уменьшить блокировку потоков.
В Java SE 1.6 блокировки имеют всего 4 состояния.
Состояние отсутствия блокировки, состояние частичной блокировки, Статус облегченной блокировки, статус тяжелой блокировки
Статус будет постепенно повышаться в зависимости от ситуации с конкуренцией.
Замок нельзя понизить после его улучшения.
устранение блокировки
JIT-компилятор устраняет блокировки, синхронизированные каким-либо кодом, который не требует синхронизации.
анализ побега
Это наблюдение за тем, является ли определенная переменная Убежит от определенной сферы
шероховатость замка
Если серия последовательных операций неоднократно блокирует и разблокирует один и тот же объект
JVM расширит (огрубит) область синхронизации блокировок за пределы всей последовательности операций.
Оптимизация программы
Уменьшите время удержания замка
Уменьшить детализацию блокировки
Используйте блокировки чтения и записи для замены монопольных блокировок.
Разделение замка
нет замка
КАС
синхронизированная блокировка синхронизации
эффект
Изменить блок кода
Блок синхронизированных операторов
Его областью действия является код, заключенный в фигурные скобки {}
Объектом действия является объект, вызывающий этот блок кода.
Изменить метод
Изменить статический метод
Изменить класс
Классификация
блокировка метода
Блокировка объекта синхронизирована (это)
Синхронизация блокировки класса (Demo.Class)
Функции
Обеспечьте упорядоченность, атомарность и видимость между потоками.
блокировка потока
принцип
Байт-код плюс идентификация
Блок кода синхронизации получает право выполнения потока посредством инструкцийmonitorenter иmonitorexit.
Метод синхронизации контролирует право выполнения потока, добавляя флаг ACC_SYNCHRONIZED.
Замок
Код
lock() получает блокировку блокирующим способом, а состояние блокировки игнорирует метод прерывания.
lockInterruptible() в отличие от lock() не игнорирует методы прерывания
tryLock() получает блокировку неблокирующим способом и может добавлять параметры времени
Блокировка и синхронизация
Сходство: Lock может выполнять все функции, реализуемые синхронизированным
Разница: Lock имеет более точную семантику потоков и лучшую производительность, чем синхронизированный.
Блокировка блокировки реализуется посредством кода
Программист освобождает его вручную и должен освободить его в предложенииfinally.
синхронизировано реализовано на уровне JVM
автоматический замок разблокировки
Область действия блокировки ограничена, область действия блока
синхронизированный может блокировать блоки, объекты и классы
ReetrantLock
Реентерабельная блокировка, блокировка мьютекса
ReeTrantЧтениеЗаписьБлокировка
Реентерабельная блокировка чтения-записи, совместное чтение-чтение, мьютекс чтения-записи, мьютекс записи-записи
StampedLock
Блокировка чтения-записи с отметкой времени, невозвратная
ReadWriteLock блокировка чтения и записи
Реализация ReentrantReadWriteLock.
Разница между синхронизированным и ReentrantLock
подожди и сообщи
ждать
1) Снимите блокировку текущего объекта.
2) Заставить текущий поток войти в очередь блокировки
поставить в известность
разбудить тред
Практика сценариев с высоким параллелизмом
Многоуровневая архитектура кэша Redis и JVM
Снижение пикового трафика промежуточного программного обеспечения сообщений и асинхронная обработка
Реализация текущей стратегии ограничения
Текущее ограничение Nginx
прилавок
скользящее временное окно
Корзина токенов, алгоритм дырявого корзины
Ограничение тока Sentinel/Hystrix
Реализация пикового понижения уровня обслуживания
Стратегия защиты системы от взлома
Настройка производительности
Настройка JVM GC
ГК
Избегайте использования метода финализации объекта Finalize().
Томкэт тюнинг
Настройка Nginx
Алгоритм Java
двоичный поиск
public static int biSearch(int []array,int a){ интервал ло = 0; int hi=array.length-1; интервал середины; в то время как (ло <= привет) { middle=(lo hi)/2;//средняя позиция если (массив [среда] == а) { вернуть середину 1; }else if(array[mid]<a){ //Поиск вправо ло=середина 1; }else{ //Поиск слева привет = середина-1; } } вернуть -1; }
алгоритм пузырьковой сортировки
public static void bubbleSort1(int [] a, int n){ интервал я, j; for(i=0; i<n; i ){//Указывает n процессов сортировки. for(j=1; j<n-i; j){ if(a[j-1] > a[j]){//Если предыдущее число больше следующего, поменяйте его местами //Обмен a[j-1] и a[j] внутренняя температура; температура = а[j-1]; а[j-1] = а[j]; а[j]=температура; } } } }
алгоритм сортировки вставками
публичная недействительная сортировка (int arr[]) { for(int i =1; i<arr.length;i) { //номер вставлен int InsertVal = arr[i]; //Вставленная позиция (готовьтесь сравнить с предыдущим числом) int индекс = я-1; //Если вставленное число меньше вставленного числа while(index>=0&&insertVal<arr[index]) { //Переместим arr[index] назад arr[индекс 1]=arr[индекс]; //Давайте индекс двигаться вперед индекс--; } //Помещаем вставленное число в соответствующую позицию arr[индекс 1]=insertVal; } }
Сканируйте сзади вперед в отсортированной последовательности, чтобы найти соответствующую позицию и вставить ее.
Сортировка вставками очень похожа на игральные карты.
алгоритм быстрой сортировки
Принцип быстрой сортировки: выберите ключевое значение в качестве базового значения. Все значения, меньшие базовой линии, находятся в левой последовательности (как правило, неупорядочены),
Те, которые больше базового значения, находятся справа (обычно неупорядочены). Обычно выбирается первый элемент последовательности.
Один цикл: сравнение сзади вперед, сравнение базового значения с последним значением, поменяйте местами позиции, если оно меньше базового значения, если нет, продолжайте сравнение со следующим, не меняйте местами до тех пор, пока не будет получено первое значение, меньшее базовое значение найдено. После нахождения этого значения сравнение начинается спереди назад. Если значение превышает базовое значение, позиция меняется местами. Если значение не сравнивается со следующим, позиция не меняется до тех пор, пока первое значение не станет больше. чем найдено базовое значение.
Пока индекс сравнения спереди назад не > индекс сзади вперед, первый цикл заканчивается. В это время для базового значения левая и правая стороны находятся в порядке.
public void sort(int[] a,int low,int high){ int start = низкий; int end = высокий; int key = a[low]; в то время как (конец> начало) { //Сравниваем сзади вперед while(end>start&&a[end]>=ключ) //Если нет меньшего значения, чем значение ключа, сравниваем следующее, пока не появится позиция свопа, меньшая, чем значение ключа, а затем сравниваем спереди назад. конец--; если (а[конец]<=ключ){ int temp = a[конец]; а[конец] = а[начало]; а[начало] = температура; } //Сравниваем спереди назад while(end>start&&a[start]<=key) //Если нет ни одной позиции, превышающей значение ключа, сравниваем следующую, пока не появится позиция свопа, превышающая значение ключа начинать ; if(a[start]>=ключ){ int temp = а [начало]; а[начало] = а[конец]; а[конец] = температура; } //На этом этапе первое сравнение цикла заканчивается, и позиция значения ключа определена. Все значения слева меньше значения ключа, а значения справа Все значения больше значения ключа, но порядок обеих сторон может быть разным. Сделайте следующий рекурсивный вызов. } //рекурсия if(start>low) sort(a,low,start-1);//Левая последовательность. От первой позиции индекса до индекса ключевого значения -1 if(end<high) sort(a,end 1,high);//правильная последовательность. От индекса ключевого значения 1 до последнего } }
Алгоритм сортировки холма
Идея: сначала разделите всю последовательность записей, подлежащих сортировке, на несколько подпоследовательностей для сортировки прямой вставкой. Когда записи во всей последовательности «в основном в порядке», выполните сортировку прямой вставкой для всех записей.
1. Метод работы: выберите возрастающую последовательность t1, t2,...,tk, где ti>t, tk=1;
2. Сортировать последовательность k раз в соответствии с количеством возрастающих последовательностей k;
На каждом проходе сортировки сортируемый столбец разбивается на несколько подпоследовательностей длиной m согласно соответствующему приращению ti, и для каждой подтаблицы выполняется сортировка прямой вставкой. Только когда коэффициент приращения равен 1, вся последовательность обрабатывается как таблица, а длина таблицы равна длине всей последовательности.
Private void ShellSort(int[] a) { int dk = a.length/2; в то время как (дк >= 1) { ShellInsertSort (а, дк); дк = дк/2; } } Private void ShellInsertSort(int[] a, int dk) { //Аналогично сортировке вставками, за исключением того, что приращение сортировки вставкой равно 1, здесь приращение равно dk, просто замените 1 на dk. for(int i=dk;i<a.length;i){ if(a[i]<a[i-dk]){ интервал j; int x=a[i];//x — элемент, который нужно вставить а[я]=а[я-дк]; for(j=i-dk; j>=0 && x<a[j];j=j-dk){ //В цикле один за другим перемещаемся назад на один бит, чтобы найти позицию для вставки. а[j dk]=a[j]; } a[j dk]=x;//Вставка } } }
алгоритм сортировки слиянием
общественный класс MergeSortTest { public static void main(String[] args) { int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 }; печать (данные); mergeSort (данные); System.out.println("Сортированный массив:"); печать (данные); } public static void mergeSort(int[] data) { sort(данные, 0, data.length - 1); } public static void sort(int[] data, int left, int right) { если (слева >= справа) возвращаться; // Находим промежуточный индекс int center = (слева направо)/2; //Рекурсия по левому массиву сортировка (данные, слева, по центру); //Рекурсия по правому массиву sort(данные, центр 1, справа); // объединяем слияние (данные, слева, по центру, справа); печать (данные); }
/** * Объедините два массива. Два массива до слияния уже были в порядке, и после слияния они остаются в порядке*. * данные @param * объект массива * @param осталось * Индекс первого элемента левого массива * @param центр * Индекс последнего элемента левого массива, центр 1 — это индекс первого элемента правого массива. * @парам верно * Индекс последнего элемента правого массива */ public static void merge(int[] data, int left, int center, int right) { //временный массив int[] tmpArr = новый int[data.length]; // Индекс первого элемента правого массива интервал середины = центр 1; // третий записывает индекс временного массива int третий = слева; //Кэшируем индекс первого элемента левого массива ИНТ ТМП = слева; while (слева <= центр && середина <= справа) { // Берем наименьший из двух массивов и помещаем его во временный массив если (данные[слева] <= данные[середина]) { tmpArr[третий] = данные[слева]; } еще { tmpArr[третий] = данные[средний]; } } //Остальные части по очереди помещаются во временный массив (фактически из двух while будет выполнено только одно) в то время как (середина <= справа) { tmpArr[третий] = данные[средний]; 04.13.2018 Страница 240 из 283 } while (слева <= центр) { tmpArr[третий] = данные[слева]; } //Копируем содержимое временного массива обратно в исходный массив // (Содержимое исходного диапазона слева и справа копируется обратно в исходный массив) в то время как (tmp <= вправо) { данные[tmp] = tmpArr[tmp]; } } public static void print(int[] data) { for (int i = 0; i < data.length; i ) { System.out.print(data[i] "\t"); } Система.out.println(); } }
алгоритм сортировки сегментов
Основная идея сортировки сегментов состоит в том, чтобы разделить массив arr на n поддиапазонов (бакетов) одинакового размера, отсортировать каждый поддиапазон отдельно и, наконец, объединить. Сортировка по подсчету — это частный случай сортировки по сегментам. Сортировку по подсчету можно рассматривать как случай, когда в каждом сегменте имеется только один элемент.
1. Найдите максимальное значение max и минимальное значение min в сортируемом массиве.
2. В качестве бакета мы используем динамический массив ArrayList, а элементы, помещенные в бакет, также сохраняются в ArrayList. Количество сегментов равно (макс-мин)/arr.length 1.
3. Перейдите по массиву arr и вычислите сегмент, в который помещается каждый элемент arr].
4. Сортируйте каждое ведро отдельно
public static void BucketSort(int[] arr){ int max = Integer.MIN_VALUE; интервал мин = Integer.MAX_VALUE; for(int i = 0; i <arr.length; i){ макс = Math.max(макс, arr[i]); min = Math.min(min, arr[i]); } //Создаем корзину int BucketNum = (макс. - мин.) / длина массива 1; ArrayList<ArrayList<Integer>> BucketArr = новый ArrayList<>(bucketNum); for(int i = 0; я <bucketNum; я){ BucketArr.add(новый ArrayList<Integer>()); } //Помещаем каждый элемент в корзину for(int i = 0; i <arr.length; i){ int num = (arr[i] - min)/(arr.length); ведроArr.get(num).add(arr[i]); } // Сортируем каждый сегмент for(int i = 0; i < BucketArr.size(); i ){ Collections.sort(bucketArr.get(i)); }}
Алгоритм поразрядной сортировки
общественный класс radixSort { inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,101,56,17,18,23,34 ,15,35,2 5,53,51}; общественная система radixSort(){ сортировка(а); for(inti=0;i<a.length;i ){ System.out.println(a[i]); } } общественная недействительная сортировка (массив int []) { //Сначала определяем количество проходов сортировки; интервал Макс = массив [0]; for(inti=1;i<array.length;i ){ если(массив[i]>max){ Макс = массив [я]; } } целое время = 0; //Оцениваем количество цифр; в то время как (макс> 0) { макс/=10; время ; } //Создаем 10 очередей; List<ArrayList> очередь=newArrayList<ArrayList>(); for(int i=0;i<10;i ){ ArrayList<Integer>queue1=new ArrayList<Integer>(); очередь.добавить(очередь1); } //Выполнение распределения и сбора времени; for(int i=0;i<time;i){ //Выделяем элементы массива; for(intj=0;j<array.length;j){ //Получаем первую цифру числа; int x=array[j]%(int)Math.pow(10,i 1)/(int)Math.pow(10, i); ArrayList<Integer>queue2=queue.get(x); очередь2.добавить(массив[j]); очередь.set(х, очередь2); } int count=0 //Счетчик элементов; //Собираем элементы очереди; for(int k=0;k<10;k ){ while(queue.get(k).size()>0){ ArrayList<Integer>queue3=queue.get(k); массив[count]=queue3.get(0); очередь3.удалить(0); считать ; } } } } }
Алгоритм обрезки
При оптимизации поисковых алгоритмов обрезка заключается в том, чтобы избежать ненужных процессов обхода посредством определенных суждений. Образно говоря, это означает отсечение некоторых «ветвей» в дереве поиска, поэтому это называется обрезкой. Основной проблемой при применении оптимизации сокращения является разработка метода оценки сокращения, то есть метода определения того, какие ветви следует отбросить, а какие оставить.
Алгоритм возврата
Алгоритм поиска с возвратом на самом деле представляет собой процесс попытки поиска, аналогичный перебору. Он в основном ищет решение проблемы во время попытки поиска. Когда обнаруживается, что условия решения больше не выполняются, он «возвращается» и возвращается, чтобы попробовать другие пути. .
алгоритм кратчайшего пути
Среди путей, которые начинаются из определенной вершины и достигают другой вершины по ребрам графа, кратчайшим путем называется путь с наименьшей суммой весов на каждом ребре. Существуют следующие алгоритмы решения задачи о кратчайшем пути: алгоритм Дейкстры, алгоритм Беллмана-Форда, алгоритм Флойда, алгоритм SPFA и т. д.
Алгоритм максимального подмассива
алгоритм самой длинной общей подпоследовательности
Алгоритм минимального связующего дерева
Существует множество алгоритмов построения минимальных остовных деревьев, но все они используют одно и то же свойство минимальных остовных деревьев: свойство MST (при условии, что N=(V,{E}) — связная сеть, а U — непустая подмножество множества вершин V, если (u, v) — ребро с минимальным весом, где u принадлежит U, а v принадлежит V-U, то должно существовать минимальное остовное дерево, содержащее ребро (u, v)). Вот два способа использования алгоритмов свойств MST для создания минимальных остовных деревьев: алгоритм Прима и алгоритм Крускала.
Мы можем построить различные связующие деревья для связной сети с n вершинами. Каждое связующее дерево можно использовать в качестве сети связи. Когда затраты на построение этой связной сети минимальны, построение связующего дерева этой связной сети называется минимальным. связующее дерево.
Основы Java
объектно-ориентированный
особенность
инкапсуляция
Скрыть свойства объекта, чтобы защитить внутреннее состояние объекта
Улучшено удобство использования и сопровождение кода.
Запретите плохое взаимодействие между объектами и улучшите модульность.
наследовать
Предоставляет объектам возможность получать поля и методы из базовых классов.
Полиморфизм
Возможность отображать один и тот же интерфейс для разных базовых типов данных.
абстрактный
Отделение поведения класса от конкретной реализации.
Объектно-ориентированные основы
Определите классы и создайте экземпляры
метод
Метод строительства
Цель: Инициализировать все внутренние поля соответствующими значениями при создании экземпляра объекта.
Конструктор по умолчанию
Инициализировать поля
Несколько методов строительства
эта переменная
параметр
Формальные параметры и фактические параметры
Формальные параметры: параметры, используемые при определении имени функции и тела функции. Целью является получение параметров, передаваемых при вызове функции, называемых «формальными параметрами».
Фактические параметры: при вызове функции в вызывающей функции параметры в круглых скобках после имени функции называются «фактическими параметрами» или для краткости «фактическими параметрами».
Передача параметров: метод передачи параметров метода в Java осуществляется по значению.
Если аргумент имеет примитивный тип, передается копия буквального значения примитивного типа.
Если параметр является ссылочным типом, передается копия значения адреса в куче объекта, на который ссылается параметр.
Фундаментальное различие между передачей по значению и передачей по ссылке заключается в том, создается ли копия переданного объекта.
Привязка параметров
Перегрузка метода: имена методов одинаковы, но их параметры разные, что называется перегрузкой метода.
модификатор контроля доступа
Публичный: имеет наибольшие права доступа и может получить доступ к любому классу, интерфейсу, исключению и т. д. в пути к классам. Он часто используется во внешних ситуациях, то есть в виде интерфейса объекта или класса с внешним миром.
protected: Основная функция — защита подклассов. Его смысл заключается в том, что подклассы могут использовать элементы, которые он модифицирует, но не другие. Это эквивалентно унаследованной вещи, передаваемой подклассам.
По умолчанию: иногда его также называют дружественным, он предназначен для доступа к этому пакету. Любые классы, интерфейсы, исключения и т. д. в этом пакете могут получать доступ друг к другу, даже к членам родительского класса, которые не изменены с помощью protected.
частный: права доступа ограничены внутренней частью класса, что является проявлением инкапсуляции. Например, большинство переменных-членов модифицируются как частные и не хотят, чтобы к ним обращался какой-либо другой внешний класс.
Наследование: расширяет
Определение: Наследование Java — наиболее важная особенность объектно-ориентированного подхода. Наследование — это создание нового класса из существующего класса. Новый класс может поглощать атрибуты данных и поведение существующего класса, а также расширять новые возможности.
Функция: Технология наследования позволяет очень легко повторно использовать предыдущий код, что может значительно сократить цикл разработки и снизить затраты на разработку.
Ключевое слово super: указывает родительский класс.
Повышение приведения: присвоение, которое безопасно изменяет тип подкласса на тип родительского класса, называется повышением приведения.
Понижающее приведение: если тип родительского класса принудительно преобразуется в тип подкласса, это нисходящее приведение.
Оператор экземпляроф
Разница между наследованием и комбинацией: наследование — это отношение is, а сочетание — это отношение has.
Полиморфизм
Определение: одна и та же операция действует на разные объекты, может иметь разные интерпретации и давать разные результаты выполнения. Во время выполнения вы можете вызывать методы производного класса через указатель на базовый класс.
Функция: позволяет добавлять дополнительные типы подклассов для реализации функционального расширения без изменения кода на основе родительского класса. Рассмотрение различных объектов подклассов как родительских классов может скрыть различия между различными объектами подклассов, написать общий код и адаптировать общее программирование к меняющимся потребностям.
Методы достижения полиморфизма: виртуальные функции, абстрактные классы, переопределения, шаблоны.
перезаписать
Определение. Если в отношениях наследования подкласс определяет метод с точно такой же сигнатурой, что и метод родительского класса, это называется переопределением.
Переопределить методы объекта
toString(): экземпляр вывода в виде строки
Equals(): определяет, являются ли два экземпляра логически равными.
hashCode(): вычислить хеш-значение экземпляра.
пример налога
Ключевое слово Final: изменение метода с помощью Final может предотвратить его перезапись подклассами.
абстрактный класс
Определение: Класс, модифицированный с помощью абстрактного, является абстрактным классом.
Функция: поскольку сам абстрактный класс предназначен только для наследования, абстрактный класс может заставить подкласс реализовать определенный им абстрактный метод, в противном случае компиляция сообщит об ошибке. Следовательно, абстрактные методы фактически эквивалентны определению «спецификаций».
абстрактное программирование
ключевое словорезюме
интерфейс
Определение: Интерфейс — это чисто абстрактный интерфейс, который более абстрактен, чем абстрактный класс, поскольку у него даже не может быть полей.
Разница между абстрактным классом и интерфейсом
Ключевое словоинтерфейс
метод по умолчанию
Статические поля и методы
Статическое поле: статическое поле
статические поля интерфейса
Статический метод: статический метод
Последовательность инициализации статических переменных и статических методов
Сумка
Java определяет пространство имен под названием package: package. Класс всегда принадлежит определенному пакету. Имя класса (например, Person) — это просто аббревиатура. Настоящее полное имя класса — это имя пакета.имя класса. Используйте пакеты для разрешения конфликтов имен
Область пакета: классы, расположенные в одном пакете, могут получать доступ к полям и методам области пакета. Поля и методы, которые не изменяются общедоступными, защищенными или частными, являются областями пакета.
Ключевое слово импорта. Цель импорта — позволить вам писать Xyz без написания abc.def.Xyz, а права доступа — это две разные вещи.
Объем
Модификаторы public, protected и Private можно использовать для ограничения области доступа.
Локальные переменные. Переменные, определенные внутри метода, называются локальными переменными. Область действия локальных переменных начинается с объявления переменной и заканчивается соответствующим блоком. Параметры метода также являются локальными переменными.
модификатор Final: Java также предоставляет модификатор Final. Final не конфликтует с правами доступа и имеет множество применений.
Украшение класса с помощью Final может предотвратить его наследование.
Украшение метода Final предотвращает его переопределение подклассами.
Изменение поля с помощью Final предотвращает его переназначение.
Украшение локальных переменных финалом предотвращает их переназначение.
путь к классам и jar
модуль
В сравнении
Абстрактные классы и интерфейсы
Суть: Абстракция — это абстракция классов и шаблонного дизайна интерфейса — это абстракция поведения и спецификация поведения;
абстрактный класс, абстрактная модификация
Предоставить общий тип для подклассов
Инкапсулируйте повторяющиеся свойства и методы в подклассах
Абстрактные классы не обязательно содержат абстрактные методы, но классы с абстрактными методами должны быть абстрактными классами и не могут быть созданы.
Конструкторы и методы класса (методы, модифицированные с помощью static) не могут быть объявлены как абстрактные методы.
Определить абстрактные методы
абстрактный модифицированный метод
Подкласс абстрактного класса, если он также не является абстрактным классом, должен реализовывать методы, объявленные абстрактным классом.
Между родительским классом и производным классом должна существовать связь «is-a», то есть родительский класс и производный класс должны быть концептуально одинаковыми.
модификация интерфейса интерфейса
По умолчанию методы интерфейса являются общедоступными. Все методы не могут быть реализованы в интерфейсе. Абстрактные классы могут иметь неабстрактные методы.
В jdk9 представлены частный метод и частный статический метод.
Реализация интерфейса должна осуществляться через подкласс. Подкласс использует ключевое слово «реализует», и интерфейс может быть реализован несколькими способами.
Если класс реализует интерфейс, он должен реализовывать все методы интерфейса, но абстрактные классы не обязательно реализуют его.
Интерфейс не может быть создан с помощью new, но его можно объявить, но он должен ссылаться на объект, реализующий интерфейс.
Переменные-члены в интерфейсе могут иметь только общедоступный статический конечный тип.
Разработчик реализует только поведенческий контракт, определенный интерфейсом, отношение «как-а».
Разница между перегрузкой и перезаписью
Перегрузка: происходит в одном классе, имя метода должно быть одинаковым, тип и номер параметра разные.
Перезапись: происходит в родительском и дочернем классах. Имя метода и список параметров должны быть одинаковыми, а возвращаемое значение меньше или равно родительскому классу.
Если модификатор доступа к методу родительского класса является закрытым, он не будет переопределен в подклассе.
Сравните с процессно-ориентированным
Объектные процедуры имеют более высокую производительность, но недостатком является то, что их не так легко поддерживать и расширять, как объектно-ориентированные.
Простота обслуживания, простота повторного использования, легкость расширения, производительность ниже, чем у процессно-ориентированной системы.
Типы данных и операции
Основные типы данных
целое значение
байт, короткий, int, длинный
Тип персонажа
голец
логическое значение
логическое значение
плавающая запятая
двойной, плавающий
тип упаковки
Байтовый, короткий, целый, длинный
логическое значение
Характер
Плавающий, Двойной
Разница между базовыми типами и типами упаковки
Типы-оболочки могут иметь значение null, базовые типы — нет.
Типы-оболочки можно использовать с дженериками, базовые типы — нет.
Примитивные типы более эффективны, чем обернутые типы.
Базовые типы хранят конкретные значения непосредственно в стеке, а типы-оболочки хранят ссылки в куче.
Значения двух типов оберток могут быть одинаковыми, но не равными
Целое число chenmo = новое целое число (10); Целое число = новое целое число (10); System.out.println(chenmo == Вангер); // ложь; System.out.println(chenmo.equals(wanger)); // правда
Упаковка и распаковка
Процесс преобразования базовых типов в обернутые типы называется упаковкой.
Процесс преобразования обернутого типа в базовый тип называется распаковкой.
ссылочный тип
добрый
интерфейс
множество
Тип массива: int[] ns = новый int[5]
Параметры командной строки String[ ] args
Нить
Строковые объекты неизменяемы.
Строка модифицируется финалом и поэтому не может быть унаследована.
StringBuffer и StringBuilder
StringBuilder имеет более высокую производительность, чем StringBuffer, но небезопасен для потоков.
Конкатенация строк:
Пустое значение, ноль и пустая строка
перечислять
отметка
Ключевые слова
вар
Операция
Целочисленные операции
Арифметика
Самоинкремент/самоуменьшение: ,--
Смещение
Битовые операции
Связанные понятия
Приоритет операции
переполнение
преобразование типов
Арифметика с плавающей запятой
Арифметика
Связанные понятия
переполнение
принудительное преобразование
Тип продвижения
Булевы операции
Операторы сравнения: >, >=, <, <=, ==, !=
Операция И: &&
Операция ИЛИ: ||
Не операция: !
Тернарный оператор: b ? x : y
Связанные понятия
Операция короткого замыкания: если результат выражения логической операции можно определить заранее, последующие вычисления не будут выполняться, а результат будет возвращен напрямую.
Приоритет реляционных операций
ссылочный тип
сильная ссылка
Тип по умолчанию
Анализ достижимости корней GC: доступны, все еще используются и не переработаны, сценарий утилизации всех программ, базовых объектов, пользовательских объектов и т. д.
Строка ул = "ххх";
мягкая ссылка
Немного слабее, чем сильные ссылки
Если памяти достаточно, она не будет перезагружена; если памяти недостаточно, она будет перезагружена.
Обычно используется для ресурсов, которые очень чувствительны к памяти и используются во многих сценариях кэширования: кэширование веб-страниц, кэширование изображений и т. д.
SoftReference<String> softReference = new SoftReference<String>(new String("xxx")); System.out.println(softReference.get());
слабая ссылка
Жизненный цикл короче, чем у мягких ссылок, и может продолжаться только до следующей сборки мусора.
Объекты с коротким жизненным циклом, такие как Key в ThreadLocal.
WeakReference<String> слабаяReference = new WeakReference<String>(new String("Блог Misout"); if(weakReference.get() == null) { System.out.println("weakReference была Переработано сборщиком мусора"); } // В результате слабая ссылка была переработана сборщиком мусора
виртуальная ссылка
Должен использоваться вместе с эталонной очередью.
В настоящее время в отрасли нет сценариев использования. Команда JVM может использовать его для внутреннего отслеживания действий по сбору мусора JVM.
Он будет переработан в любое время. После создания он может быть переработан в ближайшее время.
Функция: Чтобы лучше управлять памятью объектов и лучше выполнять сбор мусора.
PhantomReference<String> phantomReference = new PhantomReference<String>(new String("блог Misout"), new ReferenceQueue<String>()); System.out.println(phantomReference.get()); //Результат всегда равен нулю.
контроль над процессом
ввод и вывод
Вывод: System.out.println (выходное содержимое)
Ввод: Сканер-сканер = новый сканер(System.in Имя строки = Scanner.nextLine();
если решение
если... иначе, если...
Определить равенство ссылочного типа: методquals()
переключить несколько вариантов
Оператор switch также может сопоставлять строки. При сопоставлении строк он сравнивает «содержимое равно».
проникающий
цикл
пока цикл
делать цикл while
для цикла
Оператор управления циклом
перерыв: выйти из текущего цикла
continue: завершить этот цикл раньше и продолжить выполнение следующего цикла напрямую.
Основные классы Java
Нить
Создайте: String s1 = «Привет»
Сравните: s1.equals(s2)
Поиск: s1.contain(s2) s1.indexOf(s2) / s1.lastIndexOf(s2) / s1.statsWith(s2) / s1.endWith(s2)
Извлечение: s1.substring(index1, index2)
Удалите начальные и конечные пробелы: s1.trim()/s1.strip().
заменить строку
replaceFirst (регулярное выражение строки, замена строки)
Заменить подстроку: s1.replace(s2, s3)/s1.replaceAll(regex)
Разделить: s1.split(регулярное выражение)
Сращивание: String.join("символ сращивания", String[])
Получить длину строки
ул.длина()
Получить символ в определенной позиции в строке
стр.charAt(4)
Получить подстроку строки
ул.подстрока(2,5)
Сравнение строк
Найти позицию подстроки в строке
str.indexOf('a')
str.indexOf('a',2)
str.lastIndexOf('a')
str.lastIndexOf('a',2)
Преобразование регистра символов в строке
toLowerCase()
toUpperCase()
Удалить пробелы с обоих концов строки
подрезать()
Разделить строку на массив строк
разделить (строка ул)
Базовое преобразование типа в строку
String.valueOf(12,99)
Преобразование базового типа в String: String.valueOf(базовый тип)
Строка преобразуется в базовые типы: Integer.parseInt(s1)/Double.parseDouble(s1)/Boolean.parseBoolean(s1)
Строка -> char[]: char[] cs = s1.toCharArray()
char[] -> String: String s = новая строка (cs)
преобразование типов
Кодировка: byte[] b1 = s1.getBytes("Некоторый метод кодирования")
Декодирование: String s1 = new String(b1, «Некоторый метод кодирования»)
кодировать декодировать
Строитель строк
Создайте: StringBuilder sb = новый StringBuilder (размер буфера);
Напишите строку: sb.append(s1).sappend(s2)...
Удалить строку: sb.delete(start_index, end_index)
Преобразование: строка s1 = sb.toString()
StringJoiner
Создать: var sj = new StringJoiner (разделитель, начальный символ, конечный символ)
Записать строку: sj.add(s1)
Преобразование: строка s1 = sb.toString()
тип упаковки
Автоупаковка: Integer n = 100 // Компилятор автоматически использует Integer.valueOf(int)
Автоматическая распаковка: int x = n // Компилятор автоматически использует Integer.intValue();
Базовое преобразование: int x2 = Integer.parseInt("100", 16 // 256, поскольку оно анализируется в шестнадцатеричном формате;
статическая переменная
Число
JavaBeans
класс перечисления
Зачем использовать классы перечислений?
Создать: enum ClassName{A, B, C...}
Сравните: ==
Возвращает имя константы: String s = ClassName.A.name()
Возвращает порядковый номер определенной константы: int n = ClassName.A.ordinal()
Улучшение читаемости: toString()
Перечисление: переключатель
Рекордный класс
ключевое слово записи
БигИнтегер
Создать: BigInteger a = новый BigInteger("1234567890")
Операции: a.add(b) / a.subtract(b) / a.multiply(b) / a.mod(b) и т. д.
Преобразование: например, longValueExact().
BigDecimal
Создать: BigDecimal bd = новый BigDecimal("123.4567")
Количество десятичных знаков: bd.scale() // 4, четыре десятичных знака
Удалить конечные нули: bd.stripTrailingZeros()
Операция: bd.function(bd2)
Усечь
Сравните: bd.equals(bd2)
Часто используемые инструменты
Математические расчеты: Математика
Генерировать поддельные случайные числа: Случайные
Генерация безопасных случайных чисел: SecureRandom
отражение
Класс класс
Существует три способа получить экземпляр класса класса.
Получите его напрямую через класс статической переменной класса: Class cls = String.class
Если существует переменная экземпляра, ее можно получить с помощью метода getClass(), предоставляемого переменной экземпляра: String s = "Hello";Class cls = s.getClass();
Если вы знаете полное имя класса, вы можете получить его с помощью статического метода Class.forName(): Класс cls = Class.forName("java.lang.String");
Сравнение экземпляров классов и сравнение экземпляров
Получить информацию о классе объекта посредством отражения.
Создание экземпляров соответствующих типов с помощью экземпляров класса.
Особенности динамической загрузки классов виртуальной машины: Для загрузки различных классов реализации в зависимости от условий во время выполнения.
Динамическая сборка может быть достигнута
Уменьшите связанность кода
динамический прокси
Класс java.lang.Class в JDK — один из основных классов, предназначенных для реализации отражения.
динамический прокси
Во время выполнения создается целевой класс, и его методы можно вызывать и расширять.
Динамический прокси JDK
Реализуйте интерфейс InvoctionHandler.
Перепишите метод вызова и добавьте бизнес-логику.
Содержит объект целевого класса
Предоставить статический метод для получения прокси
Динамический прокси CGLib
Использовал ASM (инфраструктуру манипулирования байт-кодом) для управления байт-кодом для создания новых классов.
Java-сериализация
Сериализация: процесс преобразования объектов Java в потоки байтов.
Десериализация: процесс преобразования потока байтов в объект Java.
JavaException
бросаемый класс
Класс ошибки
Обычно относится к проблемам, связанным с виртуальными машинами.
Прерывания, вызванные ошибками этого типа, не могут быть устранены самой программой. При возникновении такой ошибки рекомендуется завершить работу программы.
Ноклассдеффаундеррор
Происходит, когда JVM работает динамически и не может найти соответствующий класс в пути к классам для загрузки в соответствии с указанным вами именем класса.
Класс исключения
Представляет исключение, которое программа может обработать, перехватить и, возможно, восстановить.
При возникновении такого исключения вам следует максимально обработать это исключение и возобновить работу программы, а не произвольно завершать исключение.
Непроверенное исключение
Относится к изъяну или логической ошибке в программе, которую невозможно исправить во время выполнения.
Исключение времени выполнения
NullPointerException/исключение нулевого указателя
NullPointerException возникает при вызове метода для нулевого объекта.
Индекс массива IndexOutOfBoundsException выходит за пределы исключения
NegativeArraySizeException Исключение отрицательной длины массива
ArithmeticException Исключение математических вычислений
Исключение приведения типа ClassCastException
SecurityException нарушение принципов безопасности
Проверенное исключение
Представляет недействительные внешние условия, которыми программа не может напрямую управлять.
Класснотфаундисключение
Ошибка возникает, когда соответствующий класс не может быть найден в пути к классам во время компиляции.
Метод NoSuchMethodException не нашел исключения
Исключение ввода и вывода IOException
NumberFormatException Строка для исключения номера
EOFException Исключение завершения файла
FileNotFoundException Исключение «Файл не найден»
Исключение базы данных операции SQLException
Броски
Действует на объявление метода, указывая, что в случае возникновения исключения его обработает вызывающая сторона метода.
Метод выдаст исключение определенного типа, чтобы его пользователи знали, какой тип исключения следует перехватывать.
Аномалия возможна, но не обязательно возникает.
Бросать
на самом деле выдает исключение
попробуй-поймай-наконец-то
И catch, и, наконец, можно опустить, но не оба одновременно.
Final обязательно будет выполнен, и возврат в catch не будет выполнен до тех пор, пока не будет выполнен кодfinally.
Основы JavaEE
иерархическая модель
Классические три слоя.
веб-слой
Сервлет/JSP
Уровень бизнес-логики (BLL)
EJB
слой сохранения
JDBC, MyBatis, спящий режим
четырехслойная модель
Уровень представления (PL)
Сервисный уровень (Сервис)
Уровень бизнес-логики (BLL)
Уровень доступа к данным (DAL)
пятислойная модель
Слой доменных объектов
DAO (уровень доступа к данным)
уровень бизнес-логики
Уровень управления MVC
Уровень представления
Многоуровневое приложение
JPA (API постоянства Java)
реализация JPA
JMS (служба сообщений Java)
JCA (архитектура соединителя JavaEE)
Управляемые компоненты, EJB
CDI (безопасное внедрение зависимостей)
Веб-слой
Сервлеты, JSP
Веб-сервисы
JavaИО/НИО
ИО
потоковая передача
поток байтов
Входной поток
PipedInputStream
БайтмассивInputStream
филеинпутстрим
Филетеринпутстрим
Буферизованный входной поток
DataInputStream
Пушбэкинпутстрим
StringBufferInputStream
ПоследовательностьInputStream
ОбъектИнпутСтрим
Выходной поток
ОбъектВыходнойПоток
PipedOutputStream
Филетераутпутстрим
Буферизованный выходной поток
DataOutputStream
PrintStream
Файлаутпутстрим
Байтмассиввыходной поток
поток символов
Писатель
Фильтр-писатель
StringWriter
PipedWriter
Выходной потокWriter
FileWriter
CharArrayПисатель
Буферизованный писатель
PrintWriter
Читатель
БуферизованныйReader
ЛинияНомерЧитатель
CharArrayReader
ИнпутStreamReader
FileReader
PipedReader
StringReader
ФильтрЧитатель
непотоковая передача
файл
другой
Сериализаблепермисс
Файловая система
Кодировка символов
ASCII, американский стандартный код обмена информацией.
Латинский код, ISO8859-1
Китайский код: GB2312/GBK/GBK18030.
Международный стандартный код, Unicode
UTF-8, UTF-16, кодировка переменной длины в соответствии с Unicode
модель ввода-вывода
BIO (Блокировка ввода-вывода): режим синхронной блокировки ввода-вывода.
NIO (новый ввод-вывод): синхронная неблокирующая модель ввода-вывода.
Канал двунаправленный канал
Буфер
Селектор
Мультиплексирование
выбирать
Принципиальная схема
недостаток: 1) Существует максимальное ограничение на количество дескрипторов файлов, которые можно отслеживать (1024). 2) Эффективность линейного сканирования низкая.
голосование
эполл
Всякий раз, когда FD будет готов, используйте функцию обратного вызова системы, чтобы напрямую вставить FD, что более эффективно. Нет ограничений на максимальное количество подключений
AIO (асинхронный ввод-вывод): асинхронная неблокирующая модель ввода-вывода.
Модель ввода-вывода, управляемая сигналом
Асинхронная модель ввода-вывода
Псевдоасинхронная модель ввода-вывода
формальные параметры и фактические параметры
Параметры, которые появляются в определении функции, называются формальными параметрами. Параметры, которые появляются при вызове функции, называются фактическими параметрами.
Переменные формальных параметров выделяют единицы памяти только при их вызове. В конце вызова выделенные единицы памяти немедленно освобождаются.
Фактическими параметрами могут быть константы, переменные, выражения, функции и т. д. Независимо от того, какого типа величины являются фактическими параметрами, они должны иметь определенные значения при вызове функций, чтобы эти значения можно было передать формальным параметрам.
В общем механизме вызова по значению в формальные параметры можно передавать только фактические параметры, но значения формальных параметров не могут быть переданы в обратном направлении к фактическим параметрам. Поэтому при вызове функции значение формального параметра меняется, но значение в фактическом параметре не меняется. В механизме вызова по ссылке адрес фактической ссылки на параметр передается формальному параметру, поэтому любые изменения, происходящие с формальным параметром, фактически происходят с переменной фактического параметра.
Основы веб-приложений Java
Приложение Servet JDBC (3.1)
Файл db.properties (файл свойств)
Содержимое файла .properties: #Адрес водителя driverClassName=oracle.jdbc.OracleDriver #Адрес подключения URL=jdbc:oracle:thin:@localhost:1521/XE #номер счета имя пользователя = система/литао #пароль пароль=123456 #необязательный #Инициализированное количество соединений в пуле соединений начальный размер = 5 #Максимальное количество подключений МаксАктив=100 #Максимальное количество соединений, зарезервированных в режиме ожидания максIdle=10 #Минимальное количество соединений, зарезервированных в режиме ожидания миножидание=5 #сверхурочная работа maxWait=10000
Импортировать 3 пакета
Написать класс инструмента пула соединений
DbcpUtil
пакет com.xdl.util
Выполните функцию входа в банковский счет
Создать таблицу банковских счетов в базе данных
Создайте init.sql
/** Создайте таблицу банковских счетов, удалите ее перед созданием */ удалить каскадное ограничение таблицы xdl_bank_account; создать таблицу xdl_bank_account( ограничение идентификационного номера xdl_bank_account_id_pk, первичный ключ, acc_no varchar(30) ограничение xdl_bank_account_acc_no_uk уникальный, acc_password варчар (30), номер аккаунта_money ); /** Создайте последовательность для этой таблицы и удалите ее перед созданием */ последовательность удаления xdl_bank_account_id_seq; создать последовательность xdl_bank_account_id_seq; /** Вставляем тестовые данные */ вставить в значения xdl_bank_account (xdl_bank_account_id_seq.nextval, 'малаоши','17',10000000); совершить;
Создайте проект и создайте классы сущностей на основе таблиц (грубо говоря, инкапсуляция)
Формат именования: удалите подчеркивание в названии таблицы и сделайте первую букву заглавной. Имя переменной соответствует таблице конструкция, установка, tostring, сериализация реализует Serializable
пакет com.xdl.bean
Определить дизайн методов интерфейса DAO.
Формат именования: добавьте DAO после класса сущности. Выполняйте только одно из действий: добавление, удаление, изменение и проверку.
com.xdl.Дао
В соответствии с интерфейсом DAO объедините программирование DbcpUtil и JDBC за пять шагов, чтобы завершить класс реализации DAO.
Формат именования: класс сущности dao, имя базы данных imp. Код подключения к базе данных 1. Загрузите драйвер 2. Установите соединение 3. Определите sql и получите предварительно скомпилированную среду sql. Установить параметры setXX 4. Выполните SQL для обработки возвращаемого значения sql select/обхода набора результатов. 5. Освободите ресурсы
com.xdl.dao.imp
Напишите класс бизнес-логики Service для инкапсуляции бизнес-методов.
Формат именования: добавьте функцию Service после класса сущности. 1. Держите ДАО 2. Придайте ценность Дао 3. Инкапсулируйте бизнес-метод (возвратите интерфейс.метод).
com.xdl.service
Тестовый класс
com.xdl.test
Напишите html-страницу для отправки запроса на вход.
Напишите сервлет для получения параметров запроса пользователя и вызовите метод в Службе на основе этих параметров, чтобы проверить, успешен ли вход в систему. В противном случае вход будет успешным.
Формат именования: добавьте сервлет после класса сущности. 0.кодирование 1. Получить параметры запроса 2. Используйте сервис, чтобы выносить суждения 3. Инкапсулируйте параметры в объекты 4. Напишите в браузер и получите объект вывода в браузер.
com.xdl.servlet
Управление статусами
Зачем нам государственное управление?
Поскольку протокол http не сохраняет состояние, при ответе на запрос запрос отключается от сервера. Последний запрос. Это не имеет ничего общего с будущими переменными данных. Но иногда необходимо получить данные о статусе последнего запроса, например, о покупке товара. Требуются данные о последней и предыдущих покупках.
Как реализовать технологию управления состоянием
Клиентская технология управления состоянием
Печенье
принцип
Когда браузер запрашивает сервер на сервере, сервер создает объект Cookie, а затем использует setCookie. Передается в браузер в виде заголовков сообщений. Когда браузер снова запрашивает услуги с сервера, он будет нести этот объект Cookie. на сервер. Сервер может узнать последний статус данных.
Как достичь?
Создайте объект cookie Файл cookie cookie = новый файл cookie («ключ», «значение»);
Как написать клиенту ответ.addCookie(cookie);
краткое содержание
Как получить соответствующий cookie в запросе Cookie [] cookie =request.getCookies();
Получить имя и значение файла cookie получитьИмя() получить значение() Настройки setValue("строковое значение")
краткое содержание
Проблемы жизненного цикла файлов cookie
Значение по умолчанию совпадает со временем жизни браузера. Оно исчезнет при закрытии браузера. Значение равно -1.
setMaxAge (интервал секунд);
По истечении срока действия файла cookie браузер больше не будет его хранить. (Как установить трехмесячный срок жизни? setMaxAge(60*60*24*93);) Установка времени жизни на 0 означает немедленное удаление файла cookie.
Проблема с путем к файлам cookie
Путь по умолчанию, по которому находится файл cookie, — это путь, по которому расположен сервлет.
Правило переноса файлов cookie заключается в том, что файлы cookie по этому пути и файлы cookie по родительскому пути, соответствующему этому пути, будут перенесены.
Вы можете изменить путь Cookie по умолчанию через setPath("/path").
Например: setPath("/servlet-day04") Это означает, что файл cookie размещен в рамках проекта. Все запросы к этому проекту будут содержать этот файл cookie.
Что означает, если путь записан как /? Представитель по всем запросам
Серверная технология управления состоянием
Сессия
базовые знания
Параметры запроса
Китайская искаженная проблема с параметрами запроса
tomcat8: в методе get нет проблем с искаженным кодом
tomcat8: проблема с искаженным кодом в режиме публикации
При отправке сообщения данные передаются в формате utf-8. Однако при декодировании tomcat по умолчанию декодируется в соответствии с ISO-8859-1.
HttpServletRequest Этот тип объекта предоставляет Tomcat соответствующий API для установки кодировки декодирования.
request.setCharacterEncoding("utf-8")
Скажите tomcat, чтобы он декодировал в utf-8
Должен появиться перед получением параметров
Это только для метода post
acc_no=новая строка (acc_no.getbytes("iso-8859-1"),"utf-8");
Сначала декодируйте в соответствии с ISO-8859-1, затем закодируйте в соответствии с utf-8.
Это обычное решение
Получить сообщение для сообщения tomcat7 и tomcat8
Получение параметров запроса
Получение параметров запроса в String Строковые данные = request.getParameter("имя") Получите соответствующие параметры запроса на основе имени, соответствующего одному значению.
String [] datas=request.getParameterValues("имя"); Получить соответствующий параметр запроса и массив соответствующих значений по названию
HttpServletRequest API для получения информации заголовка запроса
получитьМетод()
Получить метод запроса
получитьПутьсервлета();
Получите путь запроса сервлета, который эквивалентен URL-паттерну.
getContextPath()
/Имя элемента
getServerPort()
Номер порта
получитьИмяСервера()
Имя процессора
getRemoteAddr()
Получить адрес удаленного клиента
getLocalAddr()
Получить адрес сервера
getRequestURL()
Единое позиционирование ресурсов
http://localhost:8888/Web02/Zhuce
Запрос проекта хост-порта протокола
getRequestURI()
Единый идентификатор ресурса
/Web02/Чжуце
Запрос проекта
Пересылка и перенаправление
разница
Метод sendRedirect() в интерфейсе HttpServletResponse используется для реализации перенаправления.
Большие данные, облачные вычисления и другие расширения
Операции и интеграция
Непрерывная интеграция (CI/CD)
Инструмент управления версиями (SCM)
Гит
СВН
управление складом
GitLab
Менеджер репозитория Maven
Архив Апача
Мастерская JFrog
Сонатип Нексус
Инструменты сборки
Мавен
Муравей
Градл
Обнаружение кода
СонарКуб
Автоматический выпуск
Дженкинс
тест
Распределенное тестирование
Полный стресс-тест ссылок
Интеграционное тестирование
Алгоритм шифрования
АЕС
Advanced Encryption Standard (AES, Advanced Encryption Standard) — наиболее распространенный алгоритм симметричного шифрования.
Алгоритм симметричного шифрования использует один и тот же ключ для шифрования и дешифрования.
ЮАР
Алгоритм шифрования RSA — это типичный алгоритм асимметричного шифрования, основанный на математической задаче факторизации больших чисел. Это также наиболее широко используемый алгоритм асимметричного шифрования.
Асимметричное шифрование использует два ключа (открытый ключ и закрытый ключ) для шифрования и дешифрования данных.
Открытый ключ используется для шифрования, а закрытый ключ — для дешифрования.
КПР
Проверка циклическим избыточным кодом (CRC) — это хэш-функция, которая генерирует короткий проверочный код с фиксированной цифрой на основе сетевых пакетов данных или компьютерных файлов. Она в основном используется для обнаружения или проверки ошибок передачи или хранения данных, которые могут возникнуть позже.
Он использует принципы деления и остатка для обнаружения ошибок.
MD5
MD5 часто появляется как подпись файла. Когда мы загружаем файл, мы часто видим текст или строку символов с расширением .MD5, прикрепленную к странице файла. Эта строка символов означает, что весь файл рассматривается как файл. исходные данные и рассчитаны с помощью MD5. После загрузки файла мы можем использовать программное обеспечение, которое проверяет информацию MD5 файла, чтобы выполнить расчет для загруженного файла.
Двойное сравнение результатов может гарантировать точность загруженного файла.
Другое распространенное использование — шифрование конфиденциальной информации веб-сайта, такой как имена пользователей и пароли, платежные подписи и т. д.
С популяризацией технологии https современные веб-сайты широко используют передачу открытого текста на серверную часть и шифрование MD5 (с использованием смещения) для защиты конфиденциальных данных и защиты сайта и безопасности данных.
новая технология
Технология блокчейн (Java-версия)
Блокчейн-приложение
Биткойн
Эфириум
Гиперледжер
технология больших данных
Большие данные
Хадуп
Уменьшение карты
Hadoop MapReduce жизненный цикл задания
Клиент
ДжобТрекер
ТаскТрекер
Задача
Процесс реализации
1. Считайте промежуточные результаты MapTask с удаленного узла (так называемый «этап перемешивания»);
2. Сортировка пар ключ/значение по ключу (так называемый «этап сортировки»);
3. Последовательно прочитайте <ключ, список значений>, вызовите определяемую пользователем функцию уменьшения0 для обработки и сохраните окончательный результат в HDFS.
HDFS
Клиент
ИмяУзел
Вторичный NameNode
узел данных
Пряжа будет представлена после Hadoop2.0
HBase
Искра
основная архитектура
Искровое ядро
Искровой SQL
Искра Стриминг
MIlib
ГрафX
основные компоненты
Менеджер кластера: управляйте всем кластером и наблюдайте за работниками.
Рабочий узел, отвечающий за управление вычислительными узлами.
Драйвер: Запустите функцию main() приложения.
Исполнитель
Привод,
Выполняется ли процесс на рабочем узле приложения?
Модель программирования СПАРК
1. Пользователи используют API, предоставляемый SparkContext (обычно используемые включают textFile, SequenceFile, runJob, stop и т. д.) для написания прикладной программы драйвера. Кроме того, SQLContext, HiveContext и Streaming Context инкапсулируют SparkContext и предоставляют API, связанные с SQL, Hive и потоковыми вычислениями.
2. Пользовательские приложения, отправленные с использованием SparkContext, сначала будут использовать BlockManager и BroadcastManager для трансляции конфигурации задачи Hadoop. Затем задачи преобразуются в RDD с помощью DAGScheduler и организуются в группы DAG. Группы DAG также будут разделены на различные этапы. Наконец, TaskScheduler использует ActorSystem для отправки задачи менеджеру кластера (менеджеру кластера).
3. Менеджер кластера (ClusterManager) распределяет ресурсы по задачам, то есть выделяет конкретные задачи работникам, а работники создают исполнителей для управления выполнением задач. В качестве менеджеров кластера Spark можно использовать Standalone, YARN, Mesos, EC2 и т. д.
Модель расчета СПАРК
Процесс работы СПАРК
1. Создайте систему рабочей среды приложения Spark и запустите SparkContext.
2.SparkContext применяется для запуска ресурсов Executor из диспетчера ресурсов (может быть Standalone, Mesos, Yarn) и запускает StandaloneExecutorbackend,
3. Исполнитель запрашивает задачу из SparkContext.
4.SparkContext передает приложение в Executor.
5.SparkContext конструируется в граф DAG, граф DAG разбивается на этапы, набор задач отправляется в планировщик задач, и, наконец, планировщик задач отправляет задачу исполнителю для запуска.
6. Задача запускается на Исполнителе, и после запуска все ресурсы освобождаются.
Процесс СПАРК RDD
1. Создайте объект RDD.
2. Модуль DAGScheduler вмешивается в операцию для расчета зависимостей между RDD. Зависимости между RDD образуют группу DAG.
3. Каждая работа разделена на несколько этапов. Основным основанием для разделения этапов является достоверность ввода текущего коэффициента расчета. Если да, разделите его на один и тот же этап, чтобы избежать накладных расходов при передаче сообщений между несколькими этапами.
Улей
Поиск больших данных
Лусене
ЭластичныйПоиск
Функции
На основе базовой архитектуры Lucene.
Основатель индустрии поиска Java
Высокая производительность поиска в реальном времени
Обычная, подстрока, база данных памяти
член
Текст строки документа (Row)
Индекс индекса (значение ключа данных)
Анализатор сегментаторов слов (разметка)
Солр
Функции
Недоступно для поиска в реальном времени.
Натч
пряжа
менеджер ресурсов
1. ResourceManager отвечает за управление ресурсами и распределение всего кластера и представляет собой глобальную систему управления ресурсами.
2. NodeManager сообщает ResourceManager об использовании ресурсов в тактовом режиме (в настоящее время в основном об использовании ЦП и памяти). RM принимает только информацию о возврате ресурсов от NM и оставляет конкретную обработку ресурсов самому NM.
3. Планировщик YARN распределяет ресурсы приложениям на основе их запросов и не несет ответственности за мониторинг, отслеживание, обратную связь о состоянии, запуск и т. д. заданий приложений.
Менеджер узлов
1. NodeManager — это диспетчер ресурсов и задач на каждом узле. Это агент, который управляет этим компьютером и отвечает за запуск программы узла, а также за управление и мониторинг ресурсов узла. На каждом узле кластера YARN работает NodeManager.
2. NodeManager регулярно сообщает ResourceManager об использовании ресурсов (ЦП, памяти) этого узла и состоянии работы Контейнера. Когда ResourceManager отключается, NodeManager автоматически подключается к резервному узлу RM.
3. NodeManager получает и обрабатывает различные запросы от ApplicationMaster, такие как запуск и остановка контейнера.
Мастер приложений
1. Отвечает за согласование с планировщиком RM для получения ресурсов (представленных Контейнером).
2. Дальше распределить полученные задачи на внутренние задачи (вторичное распределение ресурсов).
3. Общайтесь с NM, чтобы запустить/остановить задачи.
4. Отслеживайте состояние выполнения всех задач и повторно применяйте ресурсы для задачи, чтобы перезапустить ее в случае сбоя задачи.
5. В настоящее время YARN поставляется с двумя реализациями ApplicationMaster. Одна из них — это программа-экземпляр DistributedShell, используемая для демонстрации методов записи AM. Она может применяться к определенному количеству контейнеров для параллельного запуска команды Shell или сценария Shell, а другая — для запуска MapReduce. приложения AM — MRAppMaster.
технология искусственного интеллекта
Нейронные сети
машинное обучение
глубокое обучение
Часто используемые фреймворки
DL4J
алгоритм машинного обучения
Древо решений
алгоритм случайного леса
логистическая регрессия
СВМ
Наивный Байес
Алгоритм K ближайшего соседа
Алгоритм K-средних
Алгоритм Адабаост
Марков
Математическая основа
Сценарии применения
облачные вычисления
виртуальная машина
JRockitVM
HotSpotVM
облачный родной
Кубернетес
Докер
Docker использует модель архитектуры клиент-сервер (C/S), используя удаленные API для управления и создания контейнеров Docker.
Контейнеры Docker создаются из образов Docker.
Четыре сетевых режима Docker
Хозяин
Контейнер
Никто
Режим моста
Драйверы хранилища, поддерживаемые Docker
АУФС
устройство отображения
наложение2
zfs
ВФС
Классификация облачной архитектуры
общедоступное облако
Покупка/Решение – верхний уровень
Огромные вычислительные ресурсы
Компания А создает среду облачных вычислений ---->Компания B/C/D
За рубежом: aws/google/azure
Внутренние: Aliyun/Tencent Cloud/Huaweicloud/Jinshan Cloud
Частное облако
Развертывание и построение нижнего уровня
Частные данные/важные данные
Компания А строит – Компания А использует
За рубежом: vmware vicoud
Внутри страны: облако Huawei DevCloud/H3C.
Гибридное облако: публичное облако, частное облако
Бизнес-модель облачных вычислений
SaaS
Взимайте плату за каждое использование, предоставляя услуги, отвечающие потребностям конечного пользователя.
Интернет-приложение
Пример
Salesforce
Облако Huawei: WeLink
ПааС
Обеспечить среду запуска и разработки приложений.
Предоставление компонентов для разработки приложений (например, базы данных)
Пример
Microsoft: инструменты Visio Studio для Azure
Huawei Cloud: облако для разработки программного обеспечения Devcloud
лааС
Аренда вычислительных, хранилищ, сетевых и других ИТ-ресурсов
Оплата за использование
Пример
Облачный хост Amazon EC2
Облако Huawei: ECS
Опенстэк
Много
Java-коллекции
структура сбора
Схема структуры рамы
Коллекция
Список
ArrayList
Упорядоченный и повторяемый
Основа использования массивов
Методы getter() и setter() работают быстро, но добавление и удаление выполняются медленно.
Не потокобезопасно
Когда емкости недостаточно, ArrayList представляет собой текущую емкость * 1,5 1
КопироватьонзаписьArrayList
Записывает копию массива, поддерживает эффективный параллелизм и потокобезопасен.
Чтение ArrayList без блокировки
Подходит для использования в сценариях, где операции чтения намного больше операций записи, например кэширование.
Понятие расширения отсутствует. Для каждой операции записи требуется копия, поэтому производительность операции записи низкая.
Реализованные интерфейсы, такие как List, RandomAccess, Cloneable, java.io.Serializable и т. д.
Такие методы записи, как добавление/удаление, должны быть заблокированы. Цель состоит в том, чтобы избежать копирования N копий и одновременной записи.
Связанный список
Упорядоченный и повторяемый
Нижний уровень использует двустороннюю циклическую структуру данных связанного списка.
Скорость запроса высокая, добавление и удаление выполняются быстро, add() и delete() выполняются быстро.
Не потокобезопасно
Вектор
Упорядоченный и повторяемый
Основа использования массивов
Быстро, медленно добавлять и удалять
Потобезопасность, низкая эффективность
Если емкости недостаточно, Vector по умолчанию удвоит ее.
Куча
Нижний слой также представляет собой массив, унаследованный от Vector.
Первым пришел последним, емкость по умолчанию – 10.
Приложение: оценка постфиксных выражений.
Набор
Хэшсет
Расположены в произвольном порядке и не могут повторяться.
Нижний слой реализован с помощью Hash-таблицы, а внутренний — HashMap.
Быстрая скорость доступа
Набор деревьев
Расположены в произвольном порядке и не могут повторяться.
Нижний уровень реализован с помощью двоичного дерева.
Сортировка хранилища, внутри TreeMap и SortedSet
LinkedHashSet
Используйте хранилище хеш-таблиц и используйте записи двусвязного списка для вставки данных.
Унаследовано от HashSet, внутри LinkedHashMap
Очередь
Списки, вставленные с обоих концов, также можно реализовать с помощью массивов или связанных списков.
DelayQueue
Это очередь отложенной блокировки в пакете Java concurrent, часто используемая для реализации запланированных задач.
DelayQueue реализует BlockingQueue
В основном реализуется с использованием очередей приоритетов, дополненных повторными блокировками и условиями для управления безопасностью параллелизма.
Приоритетная очередь
Это небольшая верхняя куча, не потокобезопасная.
Он не упорядочен, в верхней части кучи хранится только самый маленький элемент.
ПриоритетБлокировкаОчередь
Это очередь блокировки приоритетов в пакете Java concurrent, которая является потокобезопасной.
ArrayDeque (двусторонняя очередь)
Это специальная очередь, в которую элементы могут входить и выходить с обоих концов, отсюда и название двусторонней очереди.
Это двусторонняя очередь, реализованная в виде массива, который не является потокобезопасным.
ArrayDeque реализует интерфейс Deque, который наследуется от интерфейса Queue.
Его можно использовать непосредственно в качестве стека. Удаление из очереди и повторная очередь реализуются путем повторного использования массива через указатели на заголовок и хвост.
Когда мощности недостаточно, она будет расширена. Каждое расширение будет удваивать емкость.
карта
Хэшмап
Ключи не могут повторяться, значения могут повторяться
Базовая хеш-таблица, внутренний массив, односвязный список
Красно-черные деревья введены в jdk8 для преобразования связанных списков длиной> 8.
Значение ключа может быть нулевым, а значение также может быть нулевым.
Используйте алгоритм хеширования для настройки адреса хранилища в соответствии с hashCode().
Не потокобезопасно
Операция записи потеряна
Изменить переопределение
HashTable (хеш-таблица/хеш-таблица)
Ключи не могут повторяться, значения могут повторяться
базовая хеш-таблица
Безопасность резьбы
Ключ и значение не могут быть нулевыми
LinkedHashMap
Реализовано на основе HashMap и двусвязного списка/красно-черного дерева.
упорядоченный
заказ на размещение
Порядок их вставки соответствует порядку их считывания.
последовательность доступа
После доступа к ключу этот ключ завершается.
WeakHashMap
ConcurrentHashMap
Эффективный и потокобезопасный
Ключ и значение не могут быть нулевыми
ДеревоКарта
Ключи не могут повторяться, значения могут повторяться
Значение ключа необходимо для реализации java.lang.Comparable.
При итерации TreeMap по умолчанию выполняет сортировку в порядке возрастания по значению ключа.
Реализация NavigableMap на основе красно-черного дерева
Красно-черные деревья — это сбалансированные бинарные деревья.
Средняя высота равна log(n), а высота в худшем случае не будет превышать 2log(n).
Красно-черные деревья могут выполнять операции поиска, вставки и удаления с временной сложностью O(log2(N))
Любой дисбаланс будет устранен в течение 3 вращений.
Интерфейс сортированной карты
Карта общего порядка ключей
Характеристики
Подкласс HashTable может работать только с типом String.
Транслировать
Поток основных операций
Уменьшение карты
Модель распределенных вычислений, в основном используемая в области поиска.
Общее стирание
Дженерики и Объект Разница
Общая декларация
public <T> T doSomeThing(T t) {return t;
Общая ссылка
Принудительное преобразование больше не требуется, безопасность типов автоматически проверяется во время компиляции, а исключения неявного преобразования типов исключаются.
Объявление объекта
общественный объект doSomeThing (Объект obj) {вернуть объект};
Ссылка на объект
Может возникнуть исключение преобразования типа (ClassCastException).
Различия и аналогии
ХэшМап, ХэшСет, Разница между HashTable
Хэшсет
Хэшмап
Хэш-столкновение
метод цепочки адресов
связанный список
JDK1.7
Связанный список битового сегмента
JDK1.8
Связанный список битового сегмента красное черное дерево
Хеш-таблица
ConcurrentHashMap
ХэшМап, LinkedHashMap, Разница между TreeMap
Хэшмап
Связанный список массива/красно-черное дерево
Значения в произвольном порядке
Ключ не более чем одной записи равен нулю
В большинстве случаев, когда сортировка не требуется
LinkedHashMap
Связанный список массива/красно-черное дерево
Значения берутся в порядке вставки/порядке модификации, контролируемом accessOrder.
Ключ не более чем одной записи равен нулю
Порядок вставки и порядок удаления должен быть одинаковым.
ДеревоКарта
красное черное дерево
При вставке нажимайте естественный порядок клавиш или произвольный порядок.
ключ не может быть нулевым при хранении в естественном порядке ключей
Когда вам нужно следовать естественному порядку ключей или даже индивидуальному порядку
Список массивов, Разница между LinkedList
Arraylist основан на структуре Array (динамический массив).
Максимальная емкость массива — Integer.MAX_VALUE-8.
За освободившиеся 8 бит
①Заголовки хранилища
② Избегайте переполнения памяти машины и уменьшите вероятность ошибок, поэтому выделяйте меньше памяти.
③Максимально поддерживаемое значение — Integer.MAX_VALUE.
Динамический массив Linkedlist на основе связанного списка
Добавление и удаление данных эффективно и требует только изменения указателя.
Однако средняя эффективность доступа к данным низка, и связанный список необходимо обходить.
Разница между ArrayList и Vector
синхронность
Вектор является потокобезопасным.
Синхронизация потоков между методами
ArrayList программно небезопасен
Потоки не синхронизированы между методами
рост данных
По умолчанию вектор увеличивается в два раза по сравнению с исходным размером.
ArrayList увеличивается в 1,5 раза по сравнению с первоначальным размером
В чем разница между коллекцией и коллекциями
java.util.Collection — это интерфейс коллекции.
Предоставляет общие методы интерфейса для основных операций с объектами коллекций.
java.util.Collections — это класс-оболочка.
Различные статические методы, связанные с операциями сбора
Невозможно создать экземпляр, как класс инструмента, обслуживающий структуру Java Collection.
В чем разница между Array и ArrayList
ArrayList представляет собой «массив, который автоматически расширяет свою емкость».
Размер Array фиксирован, а размер ArrayList изменяется динамически.
Массив может содержать базовые типы и типы объектов, ArrayList может содержать только типы объектов.
Очередь — это типичный контейнер в порядке очереди (FIFO).
Разница между Offer() и add() для добавления элемента в очередь
Если вы хотите добавить новый элемент в полную очередь
Метод Offer() вернет false
Метод add() выдаст непроверенное исключение.
Разница между peek() и element() при возврате головы очереди без ее удаления
Метод peek() возвращает значение null, когда очередь пуста.
Метод element() выдает исключение NoSuchElementException.
Удалить и вернуть начало очереди. Разница между опросом() и удалением().
poll() возвращает значение null, когда очередь пуста
Remove() выдаст исключение NoSuchElementException
ИтераторИтератор
шаблон итератора
Отделите поведение обхода структур данных типа последовательности от проходимых объектов.
Итерируемый
Объекты коллекций, реализующие этот интерфейс, поддерживают итерацию и могут выполняться итерации.
Может использоваться с foreach
Итератор: итератор
Объект, предоставляющий механизм итерации. Конкретный метод итерации определяется этим интерфейсом Iterator.
Отношения между foreach и Iterator
Вызов удаления коллекции в foreach приведет к изменению исходной коллекции и возникновению ошибки.
Вы должны использовать метод удаления итератора
Сравнение цикла for и итератора
Метод get() в цикле for использует метод произвольного доступа.
ArrayList быстрее для произвольного доступа
Метод next() в итераторе использует метод последовательного доступа.
LinkedList быстрее для последовательного доступа.
Разница между Iterator и ListIterator
ListIteratorИтератор
Различная сфера использования
Итератор можно применять ко всем коллекциям Set, List и Map, а также к подтипам этих коллекций.
ListIterator можно использовать только со списком и его подтипами.
ListIterator более мощный и может добавлять, удалять, изменять и запрашивать
Методы и принципы реализации
Принцип реализации HashMap
Входной массив
место хранения
Исходный код
static int indexFor(int h, int length) { вернуть h & (длина-1);}
статический окончательный int hash (ключ объекта) { интервал ч; return (key == null) ? 0: (h = key.hashCode()) ^ (h >>> 16); }
Из-за операции суммы (длина-1) длина в большинстве случаев меньше 2 в 16-й степени. Следовательно, в операции всегда участвуют младшие 16 бит хеш-кода. Если в операции задействованы также старшие 16 бит, результирующий индекс будет более хешируемым.
Итак, (h >>> 16) получает старшие 16 бит и выполняет операцию ^ с помощью hashCode().
Поскольку & и | оба будут смещать результат к 0 или 1, что не является единой концепцией, поэтому используйте XOR
Принцип реализации HashSet
Дублирование элементов не допускается.
Значение HashSet хранится в ключе HashMap.
Нижний уровень HashSet реализован HashMap, который неупорядочен.
Элементы в HashSet хранятся в ключе HashMap.
значение объединено в бессмысленную статическую константу. Private static Final Object PRESENT = new Object();
Как гарантировать, что коллекцию нельзя будет изменить
Используйте метод Collections.unmodifyingCollection(Collection c) в пакете Collections.
Любая операция, изменяющая коллекцию, вызовет исключение Java.lang.UnsupportedOperationException.
Различные методы преобразования между массивами и коллекциями списков.
Массив в список
Использование коллектора в потоке
List<String> list5=Stream.of(str).collect(Collectors.toList());
Список в массив
Используйте метод toArray()
String[] str2=list.toArray(новая строка[list.size()]);
Получение списка методов дедупликации
Использование потока Java8 для удаления дубликатов
Список uniqueList = list.stream().distinct().collect(Collectors.toList());
Set не допускает дублирования элементов
Обход и удаление дубликатов
микросервисы
теоретические знания
ESB (служебная шина)
Содержит контент
Управление метаданными службы
Регистрация услуги, жизненный цикл
Адаптация протокола
посреднические услуги
Различные сценарии интеграции поддерживают различные режимы обработки и преобразования сообщений.
Управление и мониторинг
Журналы и статистический анализ сервисных вызовов и обработки сообщений, качества обслуживания, ухудшения качества обслуживания, управления потоками и т. д.
безопасность
Безопасность передачи данных, безопасность данных, безопасность сервисных вызовов, проверка личности и т. д.
другой
Управление транзакциями, высокая производительность, высокая доступность, высокая надежность, высокая стабильность и т. д.
предохранитель
Обнаружение регистрации службы
инструмент
Работник зоопарка
Консул
и т. д.,
эврика
Регистрация клиента (зоопарковщик)
Сторонняя регистрация (независимый сервис-регистратор)
При запуске службы Регистратор каким-либо образом уведомляется, а затем Регистратор отвечает за начало регистрационных работ в регистрационном центре.
В то же время центр регистрации должен поддерживать связь между службой и службой. Когда служба недоступна, центр регистрации должен выйти из службы.
обнаружение клиента
Обнаружение сервера
API-шлюз
API Gateway — это сервер, который также можно назвать единственным узлом, входящим в систему.
Запросить переадресацию
Перенаправление сервисов в основном устанавливает нагрузку микросервисов по клиентским запросам и перенаправляет их в разные сервисы.
Слияние ответов
Объедините работу, требующую вызова нескольких сервисных интерфейсов, в один вызов, чтобы предоставить унифицированные услуги внешнему миру.
преобразование протокола
Основное внимание уделяется поддержке преобразования протоколов между SOAP, JMS и Rest.
конверсия данных
Основное внимание уделяется поддержке возможностей преобразования форматов сообщений между XML и Json (необязательно).
сертификат безопасности
1. Контроль доступа клиентов и политика безопасности на основе токенов.
2. Для шифрования передаваемых данных и сообщений и их расшифровки на сервере на клиенте требуется независимый пакет агента SDK.
3. Шифрование передачи на основе HTTPS, поддержка цифровых сертификатов клиента и сервера.
4. Аутентификация безопасности сервиса на основе OAuth2.0 (код авторизации, клиент, режим пароля и т. д.)
Центр конфигурации
Требовать
Эффективное приобретение
восприятие в реальном времени
распределенный доступ
центр конфигурации Zookeeper
Классификация данных центра конфигурации
Планирование событий (Кафка)
Служба отслеживания (стартер-сыщик)
Поскольку количество микросервисов продолжает расти, необходимо отслеживать процесс распространения запроса от одного микросервиса к другому. SpringCloud Sleuth решает эту проблему. Он вводит уникальные идентификаторы в журнал, чтобы обеспечить согласованность вызовов микросервисов. вы можете отслеживать, как запрос передается от одного микросервиса к другому.
Сервисный автоматический выключатель (Hystrix)
Принцип действия предохранителя очень прост, как и у устройства защиты от электрической перегрузки. Он может быстро выйти из строя. Если за определенный период времени обнаружится много подобных ошибок, это приведет к быстрому сбою нескольких последующих вызовов и прекращению доступа к удаленному серверу, что не позволит приложению постоянно пытаться выполнить операции, которые могут завершиться неудачей. приложение продолжит выполнение, не дожидаясь исправления ошибок и не тратя время процессора на ожидание длительного тайм-аута. Автоматические выключатели также позволяют приложению диагностировать, исправлена ли ошибка, и если да, то приложение пытается снова вызвать операцию.
Механизм автоматического выключателя Hystrix
Когда количество неудачных запросов команд Hystrix к серверным службам превышает определенную долю (по умолчанию 50%), автоматический выключатель перейдет в состояние разомкнутой цепи (Open).
После того, как автоматический выключатель остается в состоянии разомкнутой цепи в течение определенного периода времени (по умолчанию 5 секунд), он автоматически переключается в состояние полуразомкнутой цепи (HALF-OPEN). В это время статус возврата следующего запроса будет таким. оценивается. Если запрос успешен, автоматический выключатель переключится обратно в состояние замкнутой цепи (ЗАКРЫТО), в противном случае он снова переключится в состояние разомкнутой цепи (ОТКРЫТО).
Микросервисная промежуточная платформа
Весеннее Облако Алибаба
SpringCloud Netflix
Содержит элементы
Эврик
Распределенное промежуточное программное обеспечение на основе служб REST для управления услугами.
Хистрикс
Отказоустойчивая структура, которая помогает контролировать взаимодействие компонентов между распределенными системами.
Выполнять откат службы при сбое вызова
Поддержка мониторинга в реальном времени, сигнализации и других операций.
В распределенных системах прекратите каскадные сбои (перебои в обслуживании).
Притворяться
Клиент REST, предназначенный для упрощения разработки клиента веб-службы.
Лента
Платформа балансировки нагрузки обеспечивает поддержку связи между различными клиентами в кластере микросервисов и реализует балансировку нагрузки на среднем уровне.
Зуул
Обеспечение прокси, фильтрации, маршрутизации и других функций для кластеров микросервисов.
Netty и платформа RPC
Нетти
Принцип Нетти
Это высокопроизводительная асинхронная управляемая событиями платформа NIO, реализованная на основе API, предоставляемого JAVA NIO.
Он обеспечивает поддержку TCP, UDP и передачи файлов.
Все операции ввода-вывода Netty являются асинхронными и неблокирующими.
С помощью механизма Future-Listener пользователи могут легко получать результаты операций ввода-вывода активно или с помощью механизма уведомлений.
Нетти высокая производительность
Технология мультиплексирования ввода-вывода объединяет блокировку нескольких операций ввода-вывода с блокировкой одного и того же выбора, так что система может обрабатывать несколько клиентских запросов одновременно в одном потоке.
По сравнению с традиционной многопоточной/многопроцессной моделью самое большое преимущество мультиплексирования ввода-вывода заключается в том, что накладные расходы системы невелики и системе не нужно создавать новые дополнительные процессы или потоки.
Системе не нужно охранять работу этих процессов и потоков, что снижает нагрузку на систему по обслуживанию и экономит системные ресурсы.
Мультиплексный метод связи
Поток ввода-вывода Netty NioEventLoop может одновременно обрабатывать сотни или тысячи клиентских каналов благодаря агрегированию селектора мультиплексора. Поскольку операции чтения и записи неблокируются, это может полностью повысить эффективность работы потока ввода-вывода и избежать этого. из-за приостановки потока, вызванной частой блокировкой ввода-вывода.
Асинхронная связь НИО
Поскольку Netty использует асинхронный режим связи, один поток ввода-вывода может одновременно обрабатывать N клиентских подключений и операции чтения и записи, что фундаментально решает традиционную модель синхронного блокирования ввода-вывода — одно соединение — один поток.
Нулевая копия (ПРЯМЫЕ БУФЕРЫ используют прямую память вне кучи)
1. Netty использует ПРЯМЫЕ БУФЕРЫ для получения и отправки ByteBuffer, используя прямую память вне кучи для чтения и записи сокетов, без необходимости вторичной копии байтового буфера. Если для чтения и записи сокета используется традиционная куча-память (HEAP BUFFERS), JVM скопирует буфер кучи памяти в прямую память, а затем запишет его в сокет. По сравнению с прямой памятью вне кучи, сообщение имеет дополнительную копию буфера в памяти во время процесса отправки.
2.Netty предоставляет комбинированный объект Buffer, который может объединять несколько объектов байтового буфера. Пользователи могут работать с объединенным буфером так же удобно, как и с буфером, избегая традиционного метода объединения нескольких небольших буферов в один большой посредством копирования памяти.
3. При передаче файлов Netty используется метод TransferTo, который может напрямую отправлять данные из файлового буфера в целевой канал, избегая проблем с копированием памяти, вызванных традиционным методом циклической записи.
Пул памяти (механизм повторного использования буфера на основе пула памяти)
повторно использовать буфер,
Netty предоставляет механизм повторного использования буфера на основе пула памяти.
Модель резьбы реактора
Однопоточная модель реактора
Это означает, что все операции I0 выполняются в одном потоке NIO.
1) В качестве сервера NIO получите TCP-соединение клиента;
2) В качестве клиента NIO инициируйте TCP-соединение с сервером;
3) Прочитать запрос или ответное сообщение от узла связи;
4) Отправьте запрос сообщения или ответное сообщение партнеру связи.
Поскольку в режиме Reactor используется асинхронный неблокирующий ввод-вывод, все операции ввода-вывода не вызывают блокировку. Теоретически один поток может обрабатывать все операции, связанные с вводом-выводом, независимо.
Многопоточная модель реактора
Самая большая разница между многопоточной моделью Rector и однопоточной моделью заключается в том, что существует набор потоков NIO для обработки операций ввода-вывода.
Поток-акцептор NIO используется для мониторинга сервера и получения запроса TCP-соединения клиента;
Сетевые операции I0 — чтение, запись и т.д. отвечают за пул потоков NIO.
Пул потоков может быть реализован с использованием стандартного пула потоков JDK, который содержит очередь задач и N доступных потоков. Эти потоки NIO отвечают за чтение, декодирование, кодирование и отправку сообщений.
Номер многопоточной модели главного-подчиненного реактора
Сервер больше не является отдельным потоком NIO для приема клиентских соединений, а представляет собой независимый пул потоков NIO.
После того, как Acceptor получает запрос TCP-соединения клиента и завершает обработку (которая может включать аутентификацию доступа и т. д.), он регистрирует вновь созданный SocketChannel в потоке ввода-вывода в пуле потоков ввода-вывода (пул потоков субреактора), который отвечает за чтение и запись SocketChannel и работы кодека.
Пул потоков Acceptor используется только для входа клиента, установления связи и аутентификации безопасности. После успешного установления связи ссылка регистрируется в потоке ввода-вывода внутреннего пула потоков subReactor, и поток ввода-вывода отвечает за последующие операции ввода-вывода. .
Конструкция без блокировки, переплет резьбы
Netty использует последовательный дизайн без блокировки и выполняет последовательные операции в пределах 10 потоков, чтобы избежать снижения производительности, вызванного многопоточной конкуренцией.
Несколько сериализованных потоков могут запускаться параллельно одновременно. Такая конструкция последовательных потоков с локальной блокировкой обеспечивает более высокую производительность, чем модель с несколькими рабочими потоками в очереди.
Высокопроизводительная платформа сериализации
1.SO RCVBUF и SO SNDBUF.
Обычно рекомендуемые значения — 128К или 256К.
2. ТАК TCPNODELAY:
Маленькие пакеты инкапсулируют большие пакеты, чтобы предотвратить перегрузку сети.
3. Мягкое прерывание: после включения RPS можно реализовать мягкое прерывание для повышения пропускной способности сети.
Привязка хеш-значения мягкого прерывания к процессору
Реализация Netty RPC
Концепция RPC
Вызов службы на удаленном компьютере аналогичен вызову локальной службы.
RPC может очень хорошо разделять системы. Например, WebService — это RPC, основанный на протоколе Http.
Ключевые технологии
1. Публикация и подписка на сервис. Сервер использует Zookeeper для регистрации адреса сервиса, а клиент получает доступный адрес сервиса от Zookeeper.
2. Общение. Используйте Netty в качестве коммуникационной среды.
3.Spring: используйте Spring для настройки сервисов, загрузки компонентов и сканирования аннотаций.
4. Динамический прокси. Клиент использует режим прокси для прозрачного вызова служб.
5. Кодирование и декодирование сообщений. Используйте Protostuff для сериализации и десериализации сообщений.
основной процесс
1. Потребитель услуги (клиент) вызывает услугу посредством местного вызова;
2. После получения вызова клиентская заглушка отвечает за сборку методов, параметров и т.п. в тело сообщения, которое можно передать по сети;
3.клиент-заглушка находит адрес службы и отправляет сообщение на сервер;
4. Заглушка сервера декодирует сообщение после его получения;
5. Серверная заглушка вызывает локальные службы на основе результатов декодирования;
6. Локальная служба выполняется, и результаты возвращаются на серверную заглушку;
7. Серверная заглушка упаковывает возвращаемые результаты в сообщения и отправляет их потребителю;
8. Клиентская заглушка получает сообщение и декодирует его;
9. Потребитель услуги получает конечный результат.
Кодек сообщений
Структура данных сообщения (имя интерфейса, имя метода, тип и значение параметра, идентификатор запроса времени ожидания
1. Имя интерфейса. В нашем примере имя интерфейса — «HelloWorldService». Если оно не задано, сервер не будет знать, какой интерфейс вызывать;
2. Имя метода. В интерфейсе может быть много методов. Если имя метода не передано, сервер не будет знать, какой метод вызывать;
3. Типы параметров и значения параметров. Существует множество типов параметров, таких как bool int, long, double, string, map, list и даже struct (класс и соответствующие значения параметров);
4. Тайм-аут:
5.requestID идентифицирует уникальный идентификатор запроса. Использование requestID будет подробно описано в следующем разделе.
6. Сообщение, возвращаемое сервером: обычно включает в себя следующее содержимое. Код состояния возвращаемого значения requestID
Сериализация
план
Протобуф
преимущество
Производительность
небольшой объем
После сериализации размер данных можно уменьшить примерно в 3 раза.
Сериализация выполняется быстро
В 20–100 раз быстрее, чем XML и JSON.
Быстрая скорость передачи
Благодаря небольшому размеру пропускная способность и скорость передачи будут оптимизированы.
Применение
Простой в использовании
прото-компилятор автоматически сериализует и десериализует
Низкая стоимость обслуживания
Многим платформам необходимо поддерживать только один набор файлов объектного протокола (.proto).
Хорошая обратная совместимость
То есть хорошая масштабируемость: структуру данных можно обновлять напрямую, не разрушая старый формат данных.
Хорошее шифрование
Захват содержимого передачи HTTP может видеть только байты
Область использования
Кросс-платформенный
перекрестный язык
Хорошая масштабируемость
недостаток
Функциональные аспекты
Не подходит для создания документов с текстовой разметкой (например, HTML), поскольку текст не подходит для описания структур данных.
другие аспекты
Менее универсальный
Json и XML стали стандартными инструментами письма во многих отраслях, тогда как Protobuf — это всего лишь инструмент, используемый Google внутри компании.
Плохое самообъяснение
Хранится в режиме потока двоичных данных (нечитаемый), вам нужно просмотреть файл .proto, чтобы понять структуру данных.
Подведем итог
Протокол Buffer меньше, быстрее и проще в использовании и обслуживании, чем XML и Json!
Бережливость
Авро
Процесс коммуникации
генерация requestID-AtomicLong
Сохраните обратный вызов объекта обратного вызова в глобальном ConcurrentHashMap.
синхронизированный получает блокировку обратного вызова объекта обратного вызова и вращает ожидание
Поток, прослушивающий сообщение, получает сообщение, находит блокировку обратного вызова и просыпается.
Реализация RMI
1. Напишите интерфейс удаленной службы, который должен наследовать интерфейс java.rmi.Remote, а метод должен генерировать исключение java.rmi.RemoteException;
2. Написать класс реализации удаленного интерфейса, который должен наследовать класс java.rmi.server.UnicastRemoteObject;
3. Запустите компилятор RMI (rmic) и создайте класс-заглушку клиента и класс скелета сервера;
4. Запустите реестр RMI для размещения этих служб;
5. Зарегистрировать сервис в реестре RMI;
6. Клиент ищет удаленные объекты и вызывает удаленные методы;
Межъязыковая структура RPC
Гессен
Апач бережливый
gRPC
Хпроза
Структура управления службами RPC
Даббо
состав
Поставщик
Потребитель
Реестр
Монитор
Поддерживаемые контейнеры
Весна
Пристань
Лог4j
Вход в систему
Поддерживаемые протоколы
даббо (по умолчанию)
РМИ
гессен
веб-сервис
http
бережливость
Поддерживаемые реестры
работник зоопарка
Redis
многоадресная рассылка
простой
Управление услугами
Балансировка нагрузки
Случайная загрузка (по умолчанию)
Настраиваемый вес
последовательное хеширование
минимальная активность
....
Конфигурация
Реестр поддерживает локальное кэширование (кэшируется в файловой системе).
ДаббоХ
JSF
Мотан
база данных
двигатель хранения
Механизм хранения хеша
Поддерживает операции добавления, удаления, изменения и произвольного чтения, но не поддерживает последовательное сканирование. Соответствующая система хранения является системой хранения значений ключа.
Репрезентативные базы данных: redis, Memcache, система хранения Bitcask.
Механизм хранения B-дерева
Не только поддерживает случайное чтение, но и поддерживает сканирование диапазона.
Механизм хранения LSM-дерева (Log-Structured Merge Tree)
Распределенная база данных
HBase
Обзор
Начиная с BigTable
BigTable — это распределенная система хранения, которая использует модель распределенных параллельных вычислений MapReduce, предложенную Google для обработки больших объемов данных, использует распределенную файловую систему Google GFS в качестве основного метода хранения данных и использует Chubby для предоставления услуг управления системой, которые можно расширить до Уровень PB для данных и тысяч машин, он обладает характеристиками широкой применимости, масштабируемости, высокой производительности и высокой доступности.
BigTable имеет следующие возможности:
Поддержка крупномасштабных массивов данных
Распределенная параллельная обработка данных отличается высокой эффективностью.
Легко расширяется и поддерживает динамическое масштабирование.
Подходит для дешевых устройств
Подходит для операций чтения, но не подходит для операций записи.
Введение в HBase
HBase использует Hadoop Mapreduce для обработки больших объемов данных в HBase и достижения высокопроизводительных вычислений;
Используйте Zookeeper в качестве службы совместной работы для обеспечения стабильного обслуживания и восстановления после сбоев;
Используйте HDFS в качестве высоконадежного базового хранилища и используйте дешевые кластеры для обеспечения возможности хранения больших объемов данных.
Чтобы облегчить обработку данных в HBase, Sqoop предоставляет HBase эффективную и удобную функцию импорта данных системы управления реляционными базами данных.
Pig и Hive обеспечивают языковую поддержку высокого уровня для HBase.
HBase — это реализация BigTable с открытым исходным кодом.
Основное техническое соответствие между HBase и BigTable:
Анализ отношений между HBase и традиционными реляционными базами данных
HBase — это очень зрелая и стабильная система управления базами данных. Обычно она имеет такие функции, как дисковое хранилище и структура индексов, многопоточный доступ, механизм синхронизированного доступа на основе блокировок, механизм восстановления на основе журналов, механизм транзакций и т. д.
Разница между HBase и традиционными реляционными базами данных в основном отражается в следующих аспектах:
тип данных
Операции с данными
режим хранения
Индекс данных
обслуживание данных
Масштабируемость
Интерфейс доступа к Hbase
Тип: Собственный Java API.
Особенности: Традиционные и эффективные методы доступа.
Случаи использования: подходит для параллельной пакетной обработки данных таблицы HBase с помощью заданий Hadoop MapReduce.
Тип: Оболочка HBase
Особенности: Инструмент командной строки HBase, простой интерфейс.
Варианты использования: подходит для управления HBase.
Тип: Береговой шлюз
Особенности: Использует технологию сериализации Thrift для поддержки C, PHP, Python и других языков.
Случаи использования: подходит для других гетерогенных систем для доступа к данным таблицы HBase онлайн.
Тип: REST-шлюз
Особенности: Снять языковые ограничения.
Случаи использования: Поддержка HTTP API в стиле REST для доступа к Hbase.
Тип: Свинья
Возможности: Используйте язык программирования потоковой передачи Pig Latin для обработки данных в HBase.
Варианты использования: подходит для статистики данных.
Тип: Улей
Особенности: Простой
Случаи использования: когда вам нужно получить доступ к HBase способом, подобным SQL.
Модель данных HBase
Обзор модели данных
HBase — это разреженная, многомерная, упорядоченная таблица сопоставлений. Индекс этой таблицы включает ключи строк, семейства столбцов, квалификаторы столбцов и временные метки.
Концепции, связанные с моделью данных
поверхность
HBase использует таблицы для организации данных. Таблицы состоят из строк и столбцов, а столбцы разделены на несколько семейств столбцов.
ключ строки
Каждая таблица HBase состоит из нескольких строк, и каждый столбец идентифицируется ключом столбца (Row Key).
кланы
Таблица HBase сгруппирована в набор «семейств столбцов», которые являются базовой единицей контроля доступа.
квалификатор столбца
Данные в семействе столбцов располагаются по квалификаторам столбцов (или столбцам).
Клетка
В таблице HBase ячейка (Cell) определяется ключом строки, семейством столбцов и квалификатором столбца.
Временная метка
Каждая ячейка содержит несколько версий одних и тех же данных, проиндексированных по меткам времени.
Координаты данных
HBase использует координаты для поиска данных в таблицах, и доступ к каждому значению осуществляется через координаты.
концептуальный взгляд
В концептуальном представлении HBase таблицу можно рассматривать как разреженную многомерную связь отображения.
физический вид
С концептуального уровня представления каждая таблица в HBase состоит из множества строк, но на уровне внутреннего хранилища она использует хранилище на основе столбцов, а не на основе строк, как в традиционных реляционных базах данных. Это также важные различия между HBase и традиционными реляционными базами данных. базы данных.
столбцовое хранилище
Из предыдущего обсуждения мы уже знаем, что HBase — это хранилище, ориентированное на столбцы, а HBase — это «база данных столбцов».
Принцип реализации HBase
Функциональные компоненты HBase
Библиотечные функции, привязанные к каждому клиенту.
Главный сервер (также называемый Мастером).
Множество региональных серверов.
Таблицы и регионы
В HBase хранится множество таблиц. Каждая таблица содержит только один регион, и по мере непрерывного добавления данных регион будет продолжать расти.
Позиционирование региона
Таблица HBase может быть очень большой и разбита на множество регионов, которые можно распределять по разным серверам регионов.
Рабочий механизм HBase
Архитектура системы HBase
клиент
Зоокипер сервер
Главный главный сервер
Сервер региона
Как работает региональный сервер
Процесс чтения и записи данных пользователями
обновление кэша
StoreFile
Как работает магазин
Сервер региона — это основной модуль HBase, а Store — ядро сервера региона. Каждое хранилище соответствует хранилищу семейства столбцов в таблице. Каждое хранилище содержит кэш MEMStore и несколько файлов StoreFile.
Как работает HLog
В распределенной среде необходимо учитывать системные ошибки. Например, при выходе из строя сервера региона все данные в кэше MEMStore (которые не были записаны в файл) будут потеряны. Поэтому HBase использует HLog, чтобы гарантировать возможность восстановления системы в нормальное состояние в случае сбоя.
Практика программирования HBASE
Часто используемые команды оболочки HBase
HBase часто используемые API-интерфейсы Java и примеры приложений
реляционные данные
MySQL
Оптимизация индекса
Оптимизация индексно-бинарного дерева поиска
Функции
Все нелистовые узлы имеют не более двух дочерних узлов.
Каждый узел хранит ключ
Левый указатель нелистового узла указывает на поддерево, меньшее, чем его ключ, а правый указатель указывает на поддерево, большее, чем его ключ.
ДЕЛАТЬ
Оптимизировать индекс B-дерево
Функции
Многоходовое дерево поиска, не обязательно двоичное
Определите любой листовой узел, чтобы он имел не более M сыновей и M>2;
Дочернее дерево корневого узла — [2,M]
Дочернее дерево узлов, отличных от корневого узла, равно [M/2,M]
Каждый узел хранит не менее M/2-1 (округление вверх) и не более M-1 (минимум 2 ключевых слова);
Количество ключевых слов нелистовых узлов = количеству указателей на дочерние узлы — 1;
Ключевые слова для нелистовых узлов: K[1], K[2], …, K[M-1] и K[i] < K[i 1];
Указатели на нелистовые узлы:
P[1], P[2], …, P[M] где P[1] указывает на поддерево с ключом меньше K[1],
P[M] указывает на поддерево, ключ которого больше K[M-1], а другой P[i] указывает на поддерево, ключ которого принадлежит (K[i-1], K[i]);
Все листовые узлы расположены на одном слое;
Поиск в B-дереве начинается с корневого узла и выполняет двоичный поиск по (упорядоченной) последовательности ключевых слов внутри узла. При попадании он завершается, в противном случае он входит в дочерний узел диапазона, которому принадлежит ключевое слово запроса; повторяйте, пока соответствующий дочерний указатель не станет пустым или уже не станет конечным узлом;
1. Набор ключевых слов распределен по дереву; 2. Любое ключевое слово встречается только в одном узле; 3. Поиск может закончиться на нелистовом узле; 4. Его эффективность поиска эквивалентна двоичному поиску по полному набору ключевых слов; 5. Автоматический контроль слоев; Поскольку нелистовые узлы, кроме корневого узла, должны содержать не менее M/2 сыновей, обеспечивается минимальное использование узла. Наименьшая производительность поиска равна: Среди них M — максимальное количество поддеревьев, установленных для нелистовых узлов, а N — общее количество ключевых слов; Следовательно, производительность B-дерева всегда эквивалентна двоичному поиску (независимо от значения M), и нет проблем с балансировкой B-дерева; Из-за ограничения M/2 при вставке узла, если узел заполнен, его необходимо разделить на два узла, каждый из которых занимает M/2, при удалении узла необходимы два узла, размер которых меньше M/2; быть разделенными; однородные узлы сливаются;
Оптимизированное индексное B-дерево
Функции
Является вариантом B-дерева.
Указатель дерева нелистового узла равен количеству ключевых слов.
Указатель поддерева p[i] нелистового узла указывает на поддерево, значение ключа которого принадлежит [K[i], K[i 1]). B-дерево представляет собой открытый интервал.
Добавьте указатель ссылки на все конечные узлы.
Все ключевые слова появляются в конечных узлах.
Поиск в B-дереве будет охватывать только конечные узлы (B-дерево может найти неконечные узлы). Производительность эквивалентна бинарному поиску по полному набору ключевых слов.
Все ключевые слова отображаются в связанном списке конечных узлов (плотный индекс), а связанный список упорядочен.
Невозможно попасть на нелистовые узлы.
Нелистовые узлы эквивалентны индексу конечных узлов (разреженный индекс), а конечные узлы эквивалентны уровню данных, на котором хранятся ключевые слова.
Больше подходит для систем индексирования файлов.
Эффективность запросов стабильна
Дерево B* — это вариант дерева B с меньшим количеством новых узлов и высоким использованием пространства.
Оптимизация индексного хеша и BitMap
Могут быть удовлетворены только "=" и "IN", а запросы диапазона использовать нельзя.
Невозможно использовать для сортировки данных.
Ключи частичного индекса нельзя использовать для запросов.
Плотные индексы и разреженные индексы
плотный индекс
Каждый индексный код в плотном индексном файле соответствует значению индекса.
ИННОДБ
Если определен первичный ключ, он используется как плотный индекс.
Если первичный ключ не определен, первый уникальный непустой индекс таблицы используется как плотный индекс.
Если нет первичного ключа и непустого индекса, innodb сгенерирует внутренний скрытый первичный ключ (плотный индекс).
Индекс непервичного ключа хранит соответствующие биты ключа и соответствующие им значения первичного ключа, включая два поиска.
разреженный индекс
Разреженные индексные файлы создают индексные записи только для определенных значений индексного кода.
МойИСАМ
Проблемы оптимизации индекса Оптимизировать SQL
Проверять медленный журнал Позиционирование медленного sql
Используйте переменную показа, например «%quer%» Просмотр информации о конфигурации
медленный_query_log статус открытия журнала медленных запросов
установите глобальный медленный_запрос_log = ВКЛ.
long_query_time Как долго будет записываться медленный запрос?
установить глобальное long_query_time = 1
медленный_запрос_log_file расположение файла медленного журнала
Используйте объяснение и т. д. инструмент анализировать sql
объяснять Основные ключевые слова
ИДЕНТИФИКАТОР
Порядковый номер подзапроса запроса выбора представляет предложение выбора или порядок таблицы операций. Если идентификатор одинаковый, он идет сверху вниз. Если идентификаторы разные, то тот, у которого идентификатор больше, будет иметь более высокий приоритет выполнения.
select_type
Указывает тип запроса, который в основном используется для различения обычных запросов, совместных запросов, подзапросов и других сложных запросов.
ПРОСТОЙ
НАЧАЛЬНЫЙ
ПОДЗАПРОС
ПОЛУЧЕННЫЙ
СОЮЗ
РЕЗУЛЬТАТ СОЮЗА
стол
текущая таблица выполнения
возможные_ключи
Индексы, существующие в текущей таблице, могут не обязательно использоваться.
ключ
Фактический используемый индекс. Если он равен NULL, это означает, что индекс не используется (в том числе индекс не создан или индекс недействителен).
key_len
Количество байтов, используемых в индексе. Этот столбец можно использовать для расчета длины индекса, используемого в запросе. Чем короче длина, тем лучше без потери точности. key_len представляет максимально возможную длину индексного поля, а не фактическую длину. То есть key_len рассчитывается посредством определения таблицы, а не получается посредством запроса таблицы.
ссылка
Указывает, какой столбец индекса используется, желательно константу, если это возможно. Эти столбцы или константы используются для поиска значения в индексном столбце.
тип
Запрос отсортирован от лучшего к худшему
система>const>eq_ref>ref>fulltext>ref_or_null>index_merage>unique_subquery>index_subquery>диапазон>индекс>все
Когда появляются index и all, это означает, что выполняется полное сканирование таблицы.
экстрал
extralЕсли произойдет следующая ситуация, это означает, что MYSQL вообще не может использовать индекс, и это сильно повлияет на эффективность. Оптимизируйте это как можно больше
Использование сортировки файлов
Указывает, что MYSQL будет использовать внешнюю сортировку результатов вместо чтения содержимого из таблицы в индексном порядке. Может быть отсортирован на диске или в памяти. Операция сортировки, которую невозможно выполнить с помощью индексов в MYSQL, называется «сортировкой файлов».
Использование временного
Указывает, что MYSQL использует временные таблицы для результатов запроса. Обычно используется для сортировки и группировки запросов.
ряды
На основе статистики таблицы и выбора индекса примерно оцените количество строк, которые необходимо прочитать для требуемого запроса записи. Чем меньше строк, тем лучше.
Измените sql или попробуйте создать индекс sql.
Причина совпадения индекса слева
Принцип крайнего левого сопоставления: MYSQL всегда будет соответствовать правому и прекращать сопоставление, когда достигает запроса диапазона. Например, если вы создаете последовательный индекс a, b, c, d, условия a=1 и b=2 и c>1 и d =2, d не будут использоваться. можно использовать abcd.
= и in могут выйти из строя, и оптимизатор запросов msql поможет вам оптимизировать индекс до узнаваемой формы.
причина
Нижний уровень индекса представляет собой B-дерево. Конечно, совместный индекс по-прежнему является B-деревом, но ключевое значение объединенного индекса не одно, а множественное. Построение B-дерева можно построить только на основе одного значения, поэтому база данных строит B-дерево на основе крайнего левого поля.
Несколько ситуаций совпадения Если вы создаете совместный индекс (а, б, в)
Запрос на полное соответствие значений
выберите * из table_name, где a = '1' и b = '2' и c = '3' выберите * из table_name, где b = '2', a = '1' и c = '3' выберите * из table_name, где c = '3', b = '2' и a = '1' ...
Используемый индекс и порядок подусловий не повлияют на результаты. Оптимизатор запросов Mysql автоматически оптимизирует порядок запросов.
При сопоставлении с крайним левым столбцом
выберите * из table_name, где a = '1' выберите * из table_name, где a = '1' и b = '2' выберите * из table_name, где a = '1' и b = '2' и c = '3'
Все, начиная с крайнего левого столбца, непрерывное сопоставление с использованием индекса
выберите * из table_name, где b = '2' выберите * из table_name, где c = '3' выберите * из table_name, где b = '1' и c = '3'
Ни один из них не начинается с крайнего левого угла. Последний запрос не использует индекс и использует полное сканирование таблицы.
выберите * из table_name, где a = '1' и c = '3'
В случае прерывистости используется только индекс столбца a, а также используются оба индекса b и c.
соответствовать соответствовать вперед украшенный
select * from table_name, где alike 'As%' //Все префиксы отсортированы, используйте индексный запрос; выберите * из table_name, где типа '%As'//Полный запрос таблицы выберите * из table_name, где типа '%As%'//Полный запрос таблицы
Если a является типом символа, правило сравнения заключается в сравнении первого символа строки. Если символ первой строки меньше, строка будет меньше. Если первый символ тот же, сравниваем второй символ. скоро. Таким образом, при сопоставлении префиксов используется индекс, а при сопоставлении суффиксов и инфиксов используется полное сканирование таблицы.
соответствовать соответствовать Вентилятор окружать ценить
выберите * из table_name, где a > 1 и a < 3
Вы можете выполнять запросы диапазона в крайнем левом столбце и использовать индекс
выберите * из table_name, где a > 1, a < 3 и b > 1;
При запросе в диапазоне с несколькими столбцами только самый левый столбец a может использовать индекс для запроса диапазона. В диапазоне 1<a<3 столбец b неупорядочен и не может использовать индекс. После нахождения записей 1<a<3 фильтровать их можно только по одной по условию b>1.
Точное совпадение столбца и диапазона найти столбец
выберите * из table_name, где a = 1 и b > 3;
Когда a=1, b упорядочивается, и запрос диапазона использует объединенный индекс.
Сортировать
В обычных обстоятельствах MySQL использует сортировку файлов, которая выполняется относительно медленно. Если существует индекс по порядку, этап сортировки файлов можно пропустить.
выберите * из порядка table_name по a,b,c, предел 10;
Использовать индекс
выберите * из порядка table_name по b,c,a пределу 10;
Обратный порядок без использования индекса
выберите * из порядка table_name с ограничением 10; выберите * из порядка table_name по a,b предел 10;
Использовать частичный индекс
выберите * из table_name, где a =1, порядок b,c предела 10;
Крайний левый столбец объединенного индекса является константой, и этот индекс можно использовать для последующей сортировки.
Чтение данных и изоляция транзакций
Проблемы, вызванные механизмом изоляции параллельных транзакций модуля блокировки.
Обновление потеряно
Все уровни изоляции транзакций MySQL можно избежать на уровне базы данных.
грязное чтение
Можно избежать уровня изоляции транзакции READ_COMMITTED и выше.
Поколение грязного чтения
При уровне изоляции транзакции READ_UNCOMMITTED две транзакции одновременно изменяют одну и ту же строку. Как только в одной из транзакций произойдет откат, это приведет к тому, что другая транзакция сгенерирует грязное чтение. (Транзакция A прочитала данные, которые транзакция B не смогла отправить, и фактические данные были отброшены)
неповторяющееся чтение
генерация неповторяющегося чтения
Транзакция A читает строку записей несколько раз, а транзакция B и транзакция C изменяют эту строку записей соответственно. После того, как транзакция B и транзакция C отправляют транзакцию, транзакция A еще не отправила ее. В это время транзакция A читает транзакцию B. после другого и после отправки транзакции C. Запись в этой строке была изменена, и прочитанная запись отличается.
фантомное чтение
Происходит фантомное чтение
Транзакция A читает несколько строк данных. Транзакция B изменяет набор результатов транзакции A путем вставки/удаления. Транзакция A работает снова и находит строки данных, с которыми не работали. Это похоже на иллюзию (появляются записи, которые не должны появляться). )
Текущее чтение и чтение снимка
В настоящее время читаю
выберите *** заблокировать в режиме общего доступа, выберите *** для обновления
обновить, удалить, вставить
Быстро найди и прочитай
Неблокирующее чтение без блокировки, выберите
Как реализовать неблокирующее чтение в InnoDB на уровнях RC и RR
Поля DB_TRX_ID, DB_ROLL_PTR, DB_ROW_ID в строке данных
отменить журнал
просмотр чтения
Как избежать фантомного чтения в RR
InnoDB добавит блокировку следующего ключа блокировки GAP, чтобы избежать фантомного чтения.
Будет ли блокировка GAP использоваться для индекса первичного ключа или уникального индекса?
Если соблюдены все условия, блокировка GAP не будет использоваться, а будет добавлена только блокировка записи.
На уровне изоляции RR блокировки Gap будут использоваться в неуникальных индексах или в текущих чтениях, которые не проходят через индекс.
объяснениеанализ и оптимизация
select_type (тип каждого предложения выбора в запросе)
(1) ПРОСТОЙ (простой SELECT, без UNION или подзапроса и т. д.)
(2) ПЕРВИЧНЫЙ (если запрос содержит какие-либо сложные подразделы, самый внешний выбор помечается как ПЕРВИЧНЫЙ)
(3) UNION (второй или последующий оператор SELECT в UNION)
(4) ЗАВИСИМОЕ UNION (второй или последующий оператор SELECT в UNION, в зависимости от внешнего запроса)
(5) UNION RESULT (результат UNION)
(6) ПОДЗАПРОС (первый SELECT в подзапросе)
(7) ЗАВИСИМЫЙ ПОДЗАПРОС (первый SELECT в подзапросе зависит от внешнего запроса)
(8) DERIVED (ВЫБОР производной таблицы, подзапрос предложения FROM)
(9) НЕКЭШИРУЕМЫЙ ПОДЗАПРОС (результаты подзапроса не могут быть кэшированы, и первая строка внешней ссылки должна быть переоценена)
тип (То, как MySQL находит нужную строку в таблице, Также известен как «тип доступа»)
ВСЕ: полное сканирование таблицы, MySQL просматривает всю таблицу, чтобы найти совпадающие строки.
index: полное сканирование индекса, разница между index и ALL заключается в том, что тип индекса пересекает только дерево индексов.
диапазон: извлекает только строки в заданном диапазоне, используя индекс для выбора строк (Alibaba требует меньше всего)
ref: указывает условия сопоставления соединения в приведенной выше таблице, то есть какие столбцы или константы используются для поиска значения в индексном столбце (Alibaba рекомендует лучше всего добиться этого)
eq_ref: аналогично ref, разница состоит в том, что используемый индекс является уникальным индексом. Для каждого значения ключа индекса соответствует только одна запись в таблице. Проще говоря, в качестве условия ассоциации используется первичный ключ или уникальный ключ. многотабличные соединения.
const, system: эти типы используются, когда MySQL оптимизирует определенную часть запроса и преобразует ее в константу. Если первичный ключ помещен в список, MySQL может преобразовать запрос в константу. Система — это особый случай типа const. Когда запрашиваемая таблица имеет только одну строку, используйте систему.
NULL: MySQL разлагает оператор во время процесса оптимизации, и ему даже не требуется доступ к таблице или индексу во время выполнения. Например, выбор минимального значения из столбца индекса можно выполнить с помощью отдельного поиска по индексу.
возможные_ключи
Какой индекс может использовать MySQL для поиска записей в таблице. Если для поля, участвующего в запросе, существует индекс, индекс будет указан в списке, но он не может использоваться в запросе.
Ключ
Столбец ключа показывает ключ (индекс), который MySQL фактически решил использовать.
key_len
Указывает количество байтов, используемых в индексе. Длина индекса, используемого в запросе, может быть рассчитана с помощью этого столбца (значение, отображаемое параметром key_len, представляет собой максимально возможную длину индексного поля, а не фактическую используемую длину, т. е. key_len рассчитывается на основе определения таблицы, а не извлекается из таблицы) без потери точности, чем короче длина, тем лучше
ссылка
Условие сопоставления соединения приведенной выше таблицы, то есть какие столбцы или константы используются для поиска значения в индексном столбце.
ряды
MySQL оценивает количество строк, которые необходимо прочитать, чтобы найти необходимые записи, на основе статистики таблицы и выбора индекса.
Дополнительный
Использование где: данные столбца возвращаются из таблицы, которая использует только информацию в индексе без чтения фактического действия. Это происходит, когда все запрошенные столбцы таблицы являются частью одного и того же индекса, что указывает на то, что сервер MySQL будет фильтровать после строк. извлекаются механизмом хранения
Использование временных: указывает, что MySQL необходимо использовать временные таблицы для хранения наборов результатов, что часто встречается при сортировке и группировке запросов.
(Если появляются два красных «Использование временного» и «Использование сортировки файлов», это означает низкую эффективность)
Использование буфера соединения: измененное значение подчеркивает, что при получении условия соединения индекс не используется, а для хранения промежуточных результатов необходим буфер соединения. Если появляется это значение, следует учитывать, что в зависимости от конкретных условий запроса вам может потребоваться добавить индекс для повышения производительности.
Невозможно где: это значение подчеркивает, что операторwhere не приведет к отсутствию подходящих строк.
Использование сортировки файлов. Операция сортировки в MySQL, которую невозможно выполнить с помощью индексов, называется «сортировкой файлов».
Выбрать оптимизированные таблицы: это значение означает, что, используя только индекс, оптимизатор может вернуть только одну строку из результата агрегатной функции.
Настройка MySQL
Полевой дизайн
Попробуйте использовать целые числа для представления строк
Выбирайте небольшие типы данных и по возможности указывайте короткую длину.
Используйте not null везде, где это возможно.
В одной таблице не должно быть слишком много полей.
Поля могут быть зарезервированы
Обычный формат
Первая нормальная форма 1NF: атомарность поля
Вторая нормальная форма: устранить частичную зависимость от первичных ключей.
Третья нормальная форма: устранить транзитивную зависимость от первичных ключей.
Кэш запросов
Это my.ini в Windows и my.cnf в Linux.
0: Не включено
1: Включить, кэшировать все по умолчанию, добавить select sql-no-cache в оператор SQL, чтобы отказаться от кэширования.
2: Включить, кэширование по умолчанию отсутствует, добавить select sql-cache в оператор SQL для активного кэширования (обычно используется).
Проблема с аннулированием кэша
При изменении таблицы данных любой кэш, основанный на таблице данных, будет удален.
Раздел
Только когда поле поиска является полем раздела, повышение эффективности, обеспечиваемое разделением, будет более очевидным.
Разделить по горизонтали и вертикали
Горизонтальное разделение: храните данные отдельно, создавая несколько таблиц с одинаковой структурой.
Вертикальное разделение: поместите поля, которые часто используются вместе, в отдельную таблицу. Между записями разделенной таблицы существует взаимно однозначное соответствие.
Типичная конфигурация сервера
max_connections, максимальное количество клиентских подключений
показывать переменные типа «max_connections»
table_open_cache, кеш дескриптора файла таблицы
key_buffer_size, размер кэша индекса
innodb_buffer_pool_size, размер кэш-пула механизма хранения Innodb
innodb_file_per_table
Инструменты стресс-тестирования
mysqlslap
Поиск неисправностей
Используйте команду showprocesslist, чтобы просмотреть всю текущую информацию о соединении.
Используйте команду объяснения, чтобы запросить план выполнения оператора SQL.
Включите журнал медленных запросов и просмотрите SQL медленных запросов.
NoSQL
МонгоБД
Начало работы с MongoDB
Анализ сценариев использования Nosql и sql
Базовые концепты
mongodb продвинутый
Общие команды
Быстрый старт
клиентский драйвер mongodo
Добавляйте, удаляйте, изменяйте, ищите и агрегируйте
безопасно контролировать
Продвинутое знание mongodb.
двигатель хранения
индекс
Высокая доступность
Лучшие практики и соображения
структура данных
куча
Стек — это таблица, которая ограничивает вставку и удаление только одной позицией. Эта позиция является концом таблицы и называется вершиной стека.
По принципу «последним пришел — первым ушел» (ЛИФО). Со стеком есть только две основные операции: нажатие (в стек) и извлечение (из стека). Первая эквивалентна вставке, а вторая — удалению последнего элемента.
очередь
Очередь — это специальная линейная таблица. Ее особенность заключается в том, что она допускает только операции удаления в начале таблицы (спереди) и операции вставки в конце (сзади).
Очередь представляет собой линейный список с ограниченными операциями. Конец, выполняющий операцию вставки, называется хвостом очереди, а конец, выполняющий операцию удаления, называется главой очереди.
Связь
Связанный список — это структура данных того же уровня, что и массив. Например, ArrayList, который мы используем в Java, реализован на основе массива.
Принцип реализации Linkedlist — связанный список.
Связанные списки неэффективны при обходе цикла, но имеют очевидные преимущества при вставке и удалении.
Хеш-таблица
Хэш-таблица (также называемая хеш-таблицей) — это алгоритм поиска. В отличие от таких алгоритмов, как связанные списки и деревья, алгоритм хэш-таблицы не требует при поиске ряда ключевых слов (ключевые слова — это определенные элементы в элементах данных). элемент данных, используемый для идентификации элемента данных) операция сравнения.
Алгоритм хэш-таблицы надеется получить искомый элемент данных за один доступ без какого-либо сравнения. Следовательно, необходимо установить определение между местом хранения элемента данных и его ключевым словом (которое может быть представлено ключом). Соответствующее отношение делает каждое ключевое слово соответствующим уникальному месту хранения в хеш-таблице.
Методы построения хеш-функций:
(1) Метод прямой адресации: в качестве хэш-адреса возьмите ключевое слово или значение линейной функции ключевого слова.
То есть: h(ключ) = ключ или h(ключ) = a* ключ b где a и b — константы.
(2) Метод цифрового анализа
(3) Метод квадратичного значения: возьмите средние цифры после возведения ключевого слова в квадрат в качестве хеш-адреса.
(4) Метод складывания: разделите ключевое слово на несколько частей с одинаковым количеством цифр, а затем возьмите сумму суперпозиции этих частей в качестве хеш-адреса.
(5) Метод деления с остатком: остаток, полученный после деления ключевого слова на число p, не превышающее длину хеш-таблицы m, является хеш-адресом.
То есть: h(ключ) = ключ MOD p ps m
(6) Метод случайных чисел: выберите случайную функцию и примите значение случайной функции ключевого слова в качестве его хеш-адреса.
То есть: h(ключ) = случайный(ключ)
отсортированное двоичное дерево
Каждый узел отсортированного двоичного дерева удовлетворяет:
Значение всех узлов в левом поддереве меньше значения его корневого узла,
И значение всех узлов в правом поддереве больше, чем значение его корневого узла.
операция вставки
Сначала начните с корневого узла и найдите позицию, которую вы хотите вставить (то есть родительский узел нового узла). Конкретный процесс: сравнить новый узел с текущим узлом. Если они одинаковы, это означает. они уже существуют и не могут быть вставлены снова; если они меньше текущего узла, выполните поиск в левом поддереве. Если левое поддерево пусто, текущий узел является родительским узлом, который вы ищете, и новый узел может быть найден. вставлен в левое поддерево текущего узла; если он больше текущего узла, выполните поиск в правом поддереве, если правое поддерево пусто, текущий узел является родительским узлом, который вы ищете, и новый узел может быть найден. быть вставлен в правое поддерево текущего узла.
Удаление операции
Операции удаления в основном делятся на три ситуации:
Узел, который нужно удалить, не имеет дочерних узлов.
Удаляемый узел имеет только один дочерний узел.
Удаляемый узел имеет два дочерних узла.
1. Если удаляемый узел не имеет дочерних узлов, вы можете удалить его напрямую, то есть позволить его родительскому узлу оставить дочерний узел пустым.
2. Если удаляемый узел имеет только один дочерний узел, замените удаляемый узел его дочерним узлом.
3. Если удаляемый узел имеет два дочерних узла, сначала найдите замещающий узел узла (то есть наименьший узел в правом поддереве), затем замените удаляемый узел замещающим узлом, а затем удалите замена узла.
Операция запроса
Основным процессом поисковой операции является:
Сначала сравните с корневым узлом и верните результат, если они совпадают.
Если оно меньше корневого узла, выполните рекурсивный поиск в левом поддереве.
Если он больше корневого узла, выполните рекурсивный поиск в правом поддереве.
Таким образом, легко получить максимальное (самый правый самый глубокий дочерний узел) и минимальное (самый левый и самый глубокий дочерний узел) значения в отсортированном двоичном дереве.
красное черное дерево
Характеристики красно-черных деревьев
(1) Каждый узел либо черный, либо красный.
(2) Корневой узел черный.
(3) Каждый листовой узел (NIL) черный. [Примечание: терминальный узел здесь относится к пустому конечному узлу (N, L или NULL)!
(4) Если узел красный, его дочерний узел должен быть черным.
(5) Все пути от узла к узлам-потомкам узла содержат одинаковое количество черных узлов.
Левша
Вращение влево × означает установку «правого дочернего элемента x» в качестве «отцовского узла x», то есть поворот;
Следовательно, «влево» при вращении влево означает «повернутый узел станет левым узлом».
ПОВОРОТ ВЛЕВО(T, x) y ← right[x] // Предпосылка: предполагается, что правым дочерним элементом x является y. Официальная операция начинается ниже right[x] ← left[y] // Устанавливаем «левый дочерний элемент y» в «правый дочерний элемент x», то есть устанавливаем β в правый дочерний элемент x p[left[y]] ← x // Установить «x» как «отца левого дочернего элемента y», то есть установить для отца β значение x p[y] ← p[x] // Установить «отец x» на «отец y» если p[x] = ноль[T] then root[T] ← y // Случай 1: Если «отец x» — пустой узел, установите y как корневой узел иначе, если x = left[p[x]] then left[p[x]] ← y // Случай 2: Если x является левым дочерним элементом своего родителя, тогда установите y как «левый дочерний элемент родительского элемента x» else right[p[x]] ← y // Случай 3: (x — правый дочерний элемент своего родителя) Установить y как «правый дочерний элемент родительского элемента x» left[y] ← x // Установить «x» как «левый дочерний элемент y» p[x] ← y // Устанавливаем «родительский узел x» в «y»
Правое вращение
Вращение x вправо означает установку «левого дочернего узла x» в качестве «отцовского узла x», то есть превращение x в правый узел (x становится правым дочерним элементом y)!
Следовательно, «вправо» при правом вращении означает, что «повернутый узел станет правым узлом».
ПОВОРОТ ВПРАВО(T, y) x ← left[y] // Предпосылка: предполагается, что левый дочерний элемент y — это x. Официальная операция начинается ниже left[y] ← right[x] // Установить «правый дочерний элемент x» в «левый дочерний элемент y», то есть установить β для левого дочернего элемента y p[right[x]] ← y // Устанавливаем «y» как «отец правого дочернего элемента x», то есть устанавливаем для отца β значение y p[x] ← p[y] // Установить «отец y» на «отец x» если p[y] = ноль[T] then root[T] ← x // Случай 1: Если «отец y» — пустой узел, установите x в качестве корневого узла иначе, если y = правильно [p[y]] then right[p[y]] ← x // Случай 2: Если y является правым дочерним элементом своего родителя, то установите x как «левый дочерний элемент родителя y» else left[p[y]] ← x // Случай 3: (y — левый дочерний элемент родительского элемента) Установить x как «левый дочерний элемент родительского элемента y» right[x] ← y // Устанавливаем «y» как «правого дочернего элемента x» p[y] ← x // Устанавливаем «родительский узел y» в «x»
добавить в
Шаг 1. Рассматривайте красно-черное дерево как двоичное дерево поиска и вставьте узел.
Шаг 2: Раскрасьте вставленный узел «красным».
Шаг 3: Снова сделайте его красно-черным деревом с помощью серии операций вращения или раскрашивания.
удалить
Шаг 1. Рассматривайте красно-черное дерево как дерево двоичного поиска и удаляйте узлы.
Это то же самое, что «удаление узлов в обычном двоичном дереве поиска». Есть 3 ситуации:
① Удаленный узел не имеет дочерних элементов и является конечным узлом. Затем можно удалить узел напрямую.
② У удаленного узла есть только один сын. Затем удалите узел напрямую и замените его позицию единственным дочерним узлом узла.
③ У удаленного узла есть два сына. Затем сначала найдите его узел-преемник, затем скопируйте «содержимое его узла-преемника» в «содержимое этого узла», а затем удалите «его узел-преемник».
Шаг 2: Измените дерево, выполнив серию «поворотов и перекрасок», чтобы оно снова стало красно-черным.
Потому что после удаления узла на «первом шаге» это может нарушить характеристики красно-черного дерева. Поэтому дерево необходимо исправить, «вращая и перекрашивая», чтобы оно снова стало красно-черным.
Выбирайте из 3-х случаев перекраски.
① Описание ситуации: x — узел «красно-черный».
Метод обработки: напрямую установите x на черный и закончите. В это время восстанавливаются все свойства красно-черного дерева.
2.Описание ситуации: x — узел «черный черный», x — корень.
Решение: ничего не делайте и покончите с этим. В это время восстанавливаются все свойства красно-черного дерева.
③ Описание ситуации: x — «черный» узел, x не является корнем.
B-ДЕРЕВО
B-дерево также называют сбалансированным многопутевым деревом поиска. Характеристики B-дерева m-порядка (m-арного дерева) следующие (где ceil(x) — функция верхней границы):
1. Каждый узел дерева имеет не более m детей;
2. За исключением корневого узла и листового узла, каждый другой узел имеет как минимум ceil(m / 2) дочерних узлов;
3. Если корневой узел не является листовым узлом, он должен иметь как минимум 2 дочерних узла (частный случай: корневой узел без дочерних узлов, то есть корневой узел является листовым узлом, и все дерево имеет только один корневой узел) ;
4. Все конечные узлы отображаются в одном слое, а конечные узлы не содержат никакой информации о ключевых словах (их можно рассматривать как внешние узлы или запросы).
Неисправные узлы, на самом деле этих узлов не существует, а указатели, указывающие на эти узлы, равны нулю);
5. Каждый нетерминальный узел содержит n ключевой информации: (n, PO, K1, P1, K2, P2,Kn, Pn). в:
а) Ki(=1..n) — это ключевое слово, и ключевые слова отсортированы в порядке K(-1)<Ki.
б) Pi — узел, указывающий на корень поддерева, а указатель P(-1) указывает на ключи всех узлов поддерева, которые меньше Ki, но больше K(i-1).
в) Количество ключевых слов n должно удовлетворять: ceil(m / 2)-1 <=n <=m-1.
Разница между B-деревом порядка m и B-деревом порядка m заключается в следующем:
1. Узлы с n поддеревьями содержат n ключевых слов (B-дерево — это n поддеревьев с n-1 ключевыми словами);
2. Все листовые узлы содержат информацию обо всех ключевых словах и указатели на записи, содержащие эти ключевые слова, а сами листовые узлы связаны в порядке от маленьких ключевых слов к большим. (Листовые узлы B-дерева не включают в себя всю информацию, которую необходимо найти)
3. Все нетерминальные узлы можно рассматривать как индексную часть, и узел содержит только самое большое (или наименьшее) ключевое слово в корневом узле своего поддерева. (Нетерминальные узлы B-дерева также содержат достоверную информацию, которую необходимо найти)
битовая карта
Принцип растрового изображения заключается в использовании одного бита для определения существования числа и использовании одного бита для хранения фрагмента данных, что позволяет значительно сэкономить место.
Растровое изображение — это очень часто используемая структура данных, например, используемая в фильтре Блума для сортировки неповторяющихся целых чисел и т. д.
Растровое изображение обычно реализуется на основе массива. Каждый элемент массива можно рассматривать как серию двоичных чисел, и все элементы образуют более крупный двоичный набор.
основная концепция
Основные понятия Java
JDK и JRE
JDK — это комплект разработки Java, который включает в себя инструменты, IDE и JRE, необходимые для компиляции и запуска Java.
JRE — это среда выполнения Java, включающая JVM (виртуальную машину Java) и библиотеку системных классов.
диаграмма отношений
JavaEE (Java Platform Enterprise Edition)
Содержит технические стандарты
Апплет
Это Java-программа. Обычно он запускается в веб-браузере с поддержкой Java.
Апплеты предназначены для встраивания в HTML-страницу.
Когда пользователь просматривает HTML-страницу, содержащую апплет, код апплета загружается на компьютер пользователя.
EJB
JNDI
Интерфейс именования и каталогов Java
JDBC
Сервлет
Программа, работающая на веб-сервере или сервере приложений.
Он действует как промежуточный уровень между базой данных или приложением веб-браузера и HTTP-сервером.
Сравните с компьютерной графикой
Лучшая производительность и независимость от платформы
Выполнение в адресном пространстве веб-сервера, что устраняет необходимость создания отдельного процесса для обработки каждого клиентского запроса.
Сервлету доверяют, поскольку менеджер безопасности Java применяет ряд ограничений.
Сервлетам доступна вся функциональность библиотеки классов Java.
Схема архитектуры
эффект
Реализуйте различные интерфейсы и классы, определенные спецификацией сервлета, чтобы обеспечить базовую поддержку работы сервлета.
Управление написанными пользователем классами и объектами сервлетов после создания экземпляра.
Предоставление службы HTTP, эквивалентной упрощенному серверу.
ДСП
Java IDL (язык определения интерфейса)/CORBA
XML
JMS (служба сообщений Java)
JTA (архитектура транзакций Java)
JTS (Служба транзакций Java)
JavaMail
JAF (инфраструктура активации JavaBeans)
Классификация
JavaWeb
Разрабатывать веб-программы
JavaSE
Архитектура C/S для разработки и развертывания приложений Java для использования в настольных, серверных, встроенных средах и средах реального времени.
JavaME
Запуск среды на мобильных устройствах и встроенных устройствах (мобильные телефоны, планшеты и т. д.)
диаграмма отношений
(Общий интерфейс шлюза, интерфейс общедоступного шлюза) CGI
JavaBeans
Это объектно-ориентированный интерфейс программирования.
Это класс Java, который в основном ориентирован на интеграцию приложений в инструменты разработки.
POJO (обычный объект Java)
Относится к обычным объектам Java, которые не используют Entity Beans.
По сути, его можно понимать как простой класс сущности.
Вы можете легко использовать класс POJO в качестве объекта и, конечно же, легко вызывать его методы get и set.
Класс POJO также обеспечивает удобство нашей конфигурации в среде Struts.
Сервлет
jsp
встроенные объекты
1 запрос javax.servlet.http.HttpServletRequest
Информация о запросе клиента: информация заголовка протокола HTTP, файлы cookie, параметры запроса и т. д.
2 ответа javax.servlet.http.HttpServletResponse
Используется сервером для ответа на запросы клиентов и возврата информации.
3 pageContext javax.servlet.jsp.PageContext
контекст страницы
4 сеанса javax.servlet.http.HttpSession
Сеанс между клиентом и сервером
5 приложений javax.servlet.ServletContext
Используется для получения информации о жизненном цикле приложения на стороне сервера.
6 из javax.servlet.jsp.JspWriter
Выходной поток, используемый для передачи контента с сервера клиенту.
7 конфигурация javax.servlet.ServletConfig
Во время инициализации информация передается движком Jsp на страницу Jsp.
8 страниц java.lang.Object
Указывает на саму страницу Jsp
9 исключений java.lang.Throwable
На странице возникает исключение, и создается объект исключения.
Объем
страница текущая область страницы
Значения атрибутов, хранящиеся в этой области, можно получить только с текущей страницы.
область запроса запроса
Область действия — это время от создания запроса до его завершения. Запрос может включать несколько страниц.
область сеанса сеанса
Диапазон — это период времени, в течение которого клиент и сервер постоянно соединены.
Пользователь запрашивал задействованную страницу несколько раз в течение срока действия сеанса.
глобальная область приложения
Область действия — от начала до остановки серверного веб-приложения, а также страницы, участвующие во всех запросах во всем веб-приложении.
Компонент сервлета
Что такое сервлет?
Может предоставить динамический HTML-ответ
Это класс Java, работающий на сервере.
Используется для динамического реагирования на запросы клиентов в рамках архитектуры b/s.
Этот класс Java должен соответствовать спецификации jsp/Servlet.
Как написать сервлет
три способа
Создайте динамический веб-проект и напишите класс Java, который наследует абстрактный класс javax.servlet.http.HttpServlet. Переопределить метод doGet() или doPost().
Реализуйте интерфейс javax.servlet.Servlet и переопределите все его методы.
Наследуйте абстрактный класс javax.servlet.GenericServlet и переопределите метод service().
Вам необходимо скачать web-inf и настроить web.xml.
Разверните проект на веб-сервере и используйте формат URL-адреса для запроса теста.
Создавайте динамические веб-проекты
Динамическая сеть
Примечание. Выберите рабочую среду и веб-версию Tomcat.
//Сервер сообщает браузеру, что нужно перевести в HTML и закодировать в UTF-8 resp.setContentType("text/html;charset=utf-8;");
//Запись в браузер и получение объекта вывода в браузер PrintWriter p = resp.getWriter(); p.write("<h1>" s "<h2>");
веб.xml
<!-- Настроить сервлет --> <сервлет> <servlet-name>Последовательно</servlet-name> <servlet-class>Имя пакета.Имя класса</servlet-class> </сервлет> <сопоставление сервлетов> <servlet-name>Последовательно</servlet-name> <url-pattern>/Напишите сами</url-pattern> </сервлет-сопоставление>
Отношения между сервлетом, GenericServlet и HttpServlet
Жизненный цикл сервлета
Создание объекта сервлета
По умолчанию сервлет создается при поступлении первого запроса.
(через конструктор)
Вы можете передать тег xml <load-on-startup> (загружается при запуске) со значением, большим или равным 0. Рекомендуется писать 1
Инициализация объектов сервлетов
Сразу после создания объекта вызывается void init() для завершения инициализации.
сервлет Постоянное обслуживание объектов
void doGet(запрос HttpServletRequest, ответ HttpServletResponse) выдает ServletException, IOException //Если браузер напрямую запрашивает отправку doget void doPost (запрос HttpServletRequest, ответ HttpServletResponse) выдает исключение ServletException, IOException //Когда форма отправляет запрос psot, вызовите doPost void service (запрос HttpServletRequest, ответ HttpServletResponse) выдает ServletException, IOException //Может обрабатывать как запросы на получение, так и на отправку
При отправке запроса doget только программа метода doPost сообщит 405.
@Override protected void doGet (запрос HttpServletRequest, ответ HttpServletResponse) выдает ServletException, IOException { doPost (запрос, ответ); }
решать
Неминуемая кончина объектов сервлетов
недействительное уничтожение()
После вызова объект попадает в систему сбора мусора. Он еще не стал мусором. Только когда метод вызывается, он может стать мусором, поскольку у Java-программистов есть только предложения по правам на сбор мусора.
умереть
Проблемы потокобезопасности сервлетов
причины небезопасности потока сервлета
Существует только один объект сервлета, соответствующий одному и тому же запросу. Когда несколько сервлетов выполняют одну и ту же переменную-член. При записи операций возникнет небезопасность потоков.
Как решить
через синхронизированный(это){}
Блокировка, чтобы потоки были поставлены в очередь
Просто назначьте независимую переменную каждому вызову метода, не делайте ее переменной-членом.
Объект ServletContext
Что такое объект ServletContext?
Когда проект развертывается на веб-сервере, для проекта будет создан объект типа ServletContext. Этот объект может решить проблему совместного использования и передачи информации между несколькими сервлетами.
Как его получить?
request.getServletContext()
Или this.getServletContext() в методе службы сервета.
API сервлетконтекста
Установить данные
setAttribute("имя",значение)
получить данные
setAttribute("имя")
удалить данные
удалитьАтрибут("имя")
ааааааа
getRealPath("имя папки")
Получите данные глобальных параметров, настроенные в web.xml.
getInitParameter("имя");
Настройте глобальные параметры:
<context-param>Параметр контекста
<имя-контекста>xx
<значение контекста>utf-8
Объект ServletConfig
Что такое объект ServletConfig?
Каждый независимый объект сервлета имеет выделенный ServletConfig. Обслуживать его могут объекты типа ServletConfig. Получите соответствующую информацию и информацию о конфигурации объекта сервлета.
Как его получить?
В методе службы сервета this.getServletContext()
API конфигурации сервлетов
getServletName() Получает имя сервлета.
Относится к <имя-сервлета>
getServletContext() Получает объект общей информации сервлета.
getInitParameter("name") Получает информацию о конфигурации для этого объекта сервлета на основе имени.
Написано в <сервлет> <инициализирующий-параметр> <имя-параметра> <значение-параметра>
Пересылка запроса сервлета
Принцип работы
Функции
Переадресация запросов не поддерживает междоменный доступ и может переходить только к ресурсам в текущем приложении.
После пересылки запроса URL-адрес в адресной строке браузера не изменится, поэтому браузер не знает, произошла ли пересылка внутри сервера, не говоря уже о количестве пересылок.
Веб-ресурсы, участвующие в пересылке запросов, используют один и тот же объект запроса и объект ответа.
Поскольку метод front() сначала очищает буфер ответа, сгенерированный ответ будет отправлен клиенту только тогда, когда он будет перенаправлен на последний веб-ресурс.
запросить объект домена
Сравнить с объектом домена контекста
1) Разные жизненные циклы
2) Различные области применения
3) Количество веб-приложений разное
4) Различные способы обмена данными
Распределенные системы и вызовы
(Корпоративные Java-компоненты)EJB
Это компонент, работающий на независимом сервере. Клиент вызывает объект EJB через сеть.
Служба кластера EJB
Речь идет о соединении серверов с различными функциональными модулями посредством связи RMI для достижения полной функциональности.
Старайтесь не использовать EJB
Простая разработка веб-приложений без необходимости использования EJB.
При использовании совместно с другими сервисными программами вызываемый или возвращаемый сетевой протокол может решить проблему.
Приложения со структурой C/S, к которым одновременно обращаются множество людей.
(Удаленный вызов метода)RMI
Технической основой EJB является RMI, который обеспечивает возможность удаленного вызова через RMI.
Это метод, использующий механизм сериализации объектов для реализации распределенных вычислений и удаленных вызовов.
КОРБА
Общая архитектура брокера объектных запросов, Общая архитектура брокера объектных запросов
Спецификация объектно-ориентированной распределенной прикладной системы, решение для взаимодействия аппаратных и программных систем в гетерогенных распределенных средах.
Общие термины
ОБР
Брокер объектных запросов, Брокер объектных запросов
В объектно-ориентированной распределенной среде ORB может предоставить ключевые средства связи для распределения сообщений между приложениями, серверами и сетевыми объектами.
Это основной компонент CORBA, обеспечивающий структуру структуры для идентификации и поиска объектов, управления соединениями, передачи данных и запроса связи.
объекты CORBA
Это «виртуальный» объект, который может быть обнаружен брокером объектных запросов (ORB) и может быть вызван запросами клиентской программы.
ИОР
Справочник по совместимым объектам: Справочник по совместимым объектам
Хранит почти всю информацию протокола между ORB, используемую для установления связи между клиентами и целевыми объектами, и предоставляет стандартизированный формат ссылки на объекты для взаимодействия ORB.
Каждый IOR включает имя хоста, номер порта TCP/IP и ключ объекта, который идентифицирует целевой объект на основе имени хоста и порта.
В основном он состоит из трех частей: идентификатора склада, информации о конечной точке и ключа объекта.
Схема системы CORBA
Шаги вызова запроса CORBA
(1). Найдите целевой объект.
(2). Вызовите серверное приложение.
(3) Передайте параметры, необходимые для вызова.
(4) При необходимости активируйте сервопрограмму, вызывающую целевой объект.
(5). Подождите, пока запрос завершится.
(6) Если вызов успешен, верните параметры out/inout и передайте возвращаемое значение клиенту.
(7). Если вызов не удался, верните клиенту исключение.
особенность
Осуществляет кросс-платформенную и межъязыковую передачу данных в распределенных системах.
Реализован локальный вызов удаленных методов (вызов методов на удаленном сервере локально и получение возвращаемого значения)
Принципы гетерогенных распределенных систем
Поиск платформо-независимых моделей и абстракций
Максимально скрывайте основные сложные детали, не жертвуя при этом слишком большой производительностью.
другой
Возможности Java
Сравните с С
C поддерживает указатели, но в Java нет понятия указателей.
C поддерживает множественное наследование, но Java не поддерживает множественное наследование.
Java — полностью объектно-ориентированный язык
Java автоматически перерабатывает память, тогда как в C ресурсы памяти должны быть освобождены программой.
Java не поддерживает перегрузку операторов, которая считается важной особенностью C.
Java допускает предварительную обработку, но не поддерживает функцию препроцессора. Чтобы реализовать предварительную обработку, введите операторы (импорт).
Java не поддерживает функции параметров по умолчанию, но C поддерживает.
C и C не поддерживают строковые переменные
Java не предоставляет оператор перехода
Java не поддерживает автоматическое приведение типов в C.
отказоустойчивый
По умолчанию относится к механизму обнаружения ошибок коллекций Java.
Когда несколько потоков выполняют структурные изменения в части коллекции, может возникнуть механизм отказоустойчивости.
инструмент
Редактирование исходного кода
Блокнот
EditPlus
УльтраПравить
Возвышенный текст
вим
IDE
Затмение IDE
MyEclipse
Интеллидж ИДЕЯ
NetBeans
Контейнер/сервер сервлетов
Кот
Структурная схема
Джейбосс
Пристань
ВебСфера
Веблогик
Стеклянная рыба
генерация кода
Xdoclet
Алгоритм сжатия
Gzip
Высокая степень сжатия, низкая скорость
сдувать
сдуть (уровень = 1)
Низкое сжатие, быстро
. . .
сдуть (уровень = 9)
Высокая степень сжатия, низкая скорость
Bzip2
ЛЗМА
ХЗ
LZ4
LZ4(высокий)
LZ4 (быстрый)
Очень быстро, до 320 М/с.
ЛЗО
шустрый
Снаппи (в рамке)
Шустрый (нормальный)
Идеи программирования и шаблоны проектирования
Принципы дизайна
принцип единой ответственности
Принцип открытости-закрытости
Принцип замены Лискова
принцип инверсии зависимостей
Принцип изоляции интерфейса
Принцип синтетического повторного использования
Закон Деметры
Шаблоны проектирования
творческая модель
(1) Режим Singleton (Одиночка)
(2) Простой шаблон фабрики (SimpleFactory)
(3) Шаблон фабричного метода (FactoryMothod)
(4) Шаблон абстрактной фабрики (AbstratorFactory)
(5)Выкройка строителя
(6)Прототип шаблона
структурный образец
(7) Шаблон адаптера
(8) Мостовой узор
(9)Выкройка декоратора
(10)Композитный узор
(11)Узор фасада
(12) Модель легковеса
(13)Прокси-шаблон
модели поведения
(14) Метод шаблона
(15) Шаблон команды
(16)Шаблон итератора
(17) Модель наблюдателя
(18)Шаблон «Посредник»
(19) Государственный шаблон
(20) Модель стратегии
(21)Модель цепочки ответственности
(22) Шаблон Вистора
(23) Выкройка на память
(24)Режим переводчика
Идеи программирования
АОП Аспектно-ориентированный
представлять
Разделение задач: разные проблемы решаются разными частями.
Аспектно-ориентированное программирование АОП является воплощением этой технологии.
Универсальная реализация функции соответствует так называемому аспекту (Aspect).
После того, как код бизнес-функции и код аспекта будут разделены, архитектура станет очень связной и с низкой связанностью.
Чтобы обеспечить целостность функций, аспекты в конечном итоге необходимо интегрировать в бизнес (Weave, скомпилировано)
АОП три метода плетения
Переплетение во время компиляции (статические прокси)
Требуется специальный компилятор Java, введите AspectJ.
Плетение во время загрузки класса
Требуется специальный компилятор Java, например AspectJ, AspectWerkz.
Переплетение во время выполнения (динамические прокси)
Spring использует этот метод для достижения простой реализации с помощью динамического прокси.
Весна АОП
Динамический прокси JDK
Прокси-класс получается посредством отражения, и прокси-класс должен реализовывать интерфейс.
Интерфейс вызова обработчика Прокси.newProxyInstance()
Динамический прокси CGLIB
Это библиотека классов генерации кода, которая может динамически генерировать подклассы определенного класса во время выполнения.
Динамическое проксирование осуществляется посредством наследования, поэтому, если класс помечен как окончательный, Тогда он не сможет использовать CGLIB в качестве динамического прокси.
Интерфейс методаперехватчика Класс усилителя
Основные понятия существительных АОП
Аспект
Аспект: код общих функций — это реализация
Цель
Цель: быть вплетенной в объект Аспекта
Точка присоединения
Возможности, которые можно использовать в качестве точек входа. В качестве точек входа можно использовать все методы.
Пойнткат
Определите точку соединения, где фактически применяется аспект, поддерживая регулярные выражения.
Совет
Методы в классе и как этот метод вплетен в целевой метод
Классификация
До уведомления
Уведомление после запуска
Уведомление об исключенииAfterThrowing
Последнее уведомление После
Вокруг уведомлений
Ткачество
Процесс реализации АОП
JDKProxy, Cglib для создания прокси-объектов
Подробности определяются AopProxyFactory на основе конфигурации объекта AdvisedSupport.
Стратегия заключается в том, что если целью является интерфейс, используйте JDKProxy для его реализации по умолчанию, в противном случае используйте последний.
JDKПрокси
Динамический прокси JDK — это метод реализации режима прокси. Он получает класс для проксирования посредством отражения и требует, чтобы проксируемый класс реализовал интерфейс.
JDKПрокси-ядро
Интерфейс InvoctionHandler и класс Proxy
Механизм отражения более эффективен в процессе генерации классов.
Cglib
Прокси целевого класса реализуется через наследование, а нижний уровень реализуется с помощью ASM.
Если целевой класс установлен как окончательный и не может быть унаследован Вы не можете использовать динамический прокси Cglib.
ASM более эффективен в процессе выполнения после создания классов.
режим прокси
Интерфейс Реальный класс реализации Прокси-класс
Реализация прокси весной
Логика реального класса реализации содержится в методе getBean.
То, что возвращает метод getBean, на самом деле является экземпляром Proxy.
Экземпляр Proxy динамически генерируется Spring с использованием JDKProxy или Cglib.
МОК контроль обеспечить регресс
Основная часть Spring Core
Инверсия зависимостей, внедрение зависимостей
Пример: надстройка зависит от нижней структуры, такой код практически не поддается сопровождению. Если вы хотите изменить колесо, вам придется изменить все классы.
Смысл внедрения зависимостей: передать нижний класс в качестве параметра верхнему классу, чтобы реализовать «контроль» верхнего уровня над нижним слоем.
Инъекционный метод
Установить впрыск
Внедрение интерфейса
Внедрение аннотаций
внедрение конструктора
Преимущества контейнеров IOC
Избегайте повсеместного использования new для создания классов и единообразного их обслуживания.
В процессе создания экземпляра вам не нужно знать детали
Что происходит, когда проект начинается
1. Когда Spring запустится, прочитайте информацию о компоненте, предоставленную приложением. .2. Создайте реестр конфигурации компонента на основе прочитанной информации о конфигурации компонента. 3. Создайте экземпляр компонента в соответствии с его реестром, соберите зависимости компонента и обеспечьте готовую рабочую среду для верхнего уровня. 4. Используйте функцию отражения Java для создания экземпляров bean-компонентов и установления зависимостей между bean-компонентами.
Какие функции поддерживает IOC?
внедрение зависимости
Проверка зависимостей
автоматическая сборка
Поддержка коллекций
Разработать первоначальный метод и метод уничтожения.
Поддержка обратного вызова для определенных методов
Интерфейс ядра контейнера Spring IOC
БинФабрика
Обеспечивает механизм конфигурации IOC
Содержит различные определения bean-компонентов для облегчения создания экземпляров bean-компонентов.
Установить зависимости между bean-компонентами
Контроль жизненного цикла компонента
Контекст приложения
Наследует несколько интерфейсов
БинФабрика
Умеет управлять и собирать Beans
РесаурспаттернРезолвер
Возможность загрузки файлов ресурсов
Источник сообщения
Возможность реализации функций, связанных с интернационализацией.
ПриложениеEventPublisher
Возможность регистрации слушателей и реализации механизмов мониторинга.
Определение компонента
В основном используется для описания определений компонентов.
BeanDefinitionRegistry
Предоставляет методы для регистрации объектов BeanDefinition в контейнере IOC.
Сравнение BeanFactory и ApplicationContext
BeanFactory — это инфраструктура Spring. ApplicationContext предназначен для разработчиков среды Spring.
метод обновления
Обеспечить условия для управления жизненным циклом IOC-контейнеров и Bean-компонентов.
Обновите информацию о контексте Spring и определите процесс загрузки контекста Spring.
метод getBean
Преобразование beanName
Загрузить экземпляр из кеша
Создание экземпляров bean-компонентов
Обнаружить родительскийBeanFactory
Инициализировать зависимые компоненты
Создание компонентов
Общие вопросы на собеседовании
Весенняя фасоль
синглтон
Область действия контейнера Spring по умолчанию, в контейнере будет уникальный экземпляр Bean.
Подходит для bean-компонентов без сохранения состояния
опытный образец
Для каждого запроса getBean контейнер создает новый экземпляр Bean.
Подходит для bean-компонентов с состоянием
запрос
Экземпляр Bean будет создан для каждого HTTP-запроса.
сессия
Экземпляр Bean будет создан для каждого сеанса.
глобальная сессия
Экземпляр Bean будет создан для каждого глобального Http-сеанса. Эта область действия действует только для портлетов.
дополнительная поддержка веб-контейнера
Жизненный цикл компонента
InstantiateBean
Сознательно (внедрить Bean ID, BeanFactory, AppCtx)
Осознанный интерфейс объявляет зависимости
BeanPostProcessor(ы) постпроцессбефориницилизация
Метод предварительной инициализации После того, как Spring завершит создание экземпляра, Добавьте некоторую пользовательскую логику обработки в bean-компоненты, экземпляры которых создаются контейнером Spring.
Инициализация Beans(s).afterPropertiesSet
Индивидуальный метод bean.init
BeanPosProcessor(ы). постпроцессафтеинициализация
Метод пост-инициализации После завершения инициализации компонента Пользовательские операции
Инициализация компонента завершена
Создание бина
Процесс уничтожения бобов
Если реализован интерфейс DisposableBean, будет вызван метод уничтожения.
Если настроен атрибут Destroy-method, будет вызван ранее настроенный метод уничтожения.
Уничтожение бобов
Продвинутые основы Java
Теоретические основы
стек, куча и область методов
Переменные базовых типов данных, ссылки на объекты и вызовы функций сохраняются в стеке JVM.
Объекты, созданные с помощью нового ключевого слова и конструктора, помещаются в кучу.
Область метода и куча — это области памяти, совместно используемые каждым потоком и используемые для хранения информации о классе, констант, статических переменных, кода, скомпилированного JIT-компилятором и т. д., которые были загружены JVM.
Стековое пространство работает быстрее всего, но стек очень мал. Обычно в куче размещается большое количество объектов.
Размеры стека и кучи можно регулировать с помощью параметров запуска JVM.
Недостаток места в стеке вызовет ошибку StackOverflowError, а недостаток места в куче и постоянном пуле приведет к ошибке OutOfMemoryError.
Основные виды и виды упаковки
Типы-оболочки могут иметь значение null, базовые типы — нет.
Типы-оболочки можно использовать с дженериками, базовые типы — нет.
Примитивные типы более эффективны, чем обернутые типы.
Базовые типы хранят конкретные значения непосредственно в стеке, а типы-оболочки хранят ссылки в куче.
Значения двух типов оберток могут быть одинаковыми, но не равными
Целое число chenmo = новое целое число (10); Целое число = новое целое число (10); System.out.println(chenmo == Вангер); // ложь; System.out.println(chenmo.equals(wanger)); // правда
Упаковка и распаковка
Процесс преобразования базовых типов в обернутые типы называется упаковкой.
Процесс преобразования обернутого типа в базовый тип называется распаковкой.
Строка и StringBuilder, StringBuffer
String — это строка, доступная только для чтения, что означает, что содержимое строки, на которую ссылается String, не может быть изменено.
Строковый объект, представленный классом StringBuffer/StringBuilder, можно изменить напрямую.
StringBuilder используется в одном потоке и небезопасен для потоков, но его производительность намного выше, чем у StringBuffer.
окончательный, наконец, завершить
финальный
Если класс объявлен окончательным, это означает, что он не может порождать новые подклассы, то есть не может быть унаследован, что является антонимом абстрактного.
Объявляйте переменные как окончательные, чтобы гарантировать, что они не будут изменены во время использования.
окончательно
Обычно размещается после try...catch..., структура всегда выполняет блок кода, а это означает, что независимо от того, выполняется ли программа нормально или возникает исключение, код здесь может выполняться до тех пор, пока JVM не будет закрыта.
завершить
Java позволяет использовать метод Finalize() для выполнения необходимой работы по очистке перед тем, как сборщик мусора очистит объект из памяти.
статический финал/финальный статический
Свойство, измененное с помощью статического финала, означает, что после того, как значение задано, оно не может быть изменено и доступно через имя класса.
статический окончательный модифицированный метод, указывающий, что метод не может быть переопределен и может быть вызван без нового объекта
== и hashCode и методы равенства
Equals() может подтвердить, действительно ли они равны.
Реализация по умолчанию в классе Object: return this == obj. True будет возвращено, только если this и obj относятся к одному и тому же объекту.
Переопределить равно
Рефлексивность: x.equals(x) должно быть истинным
Для нуля: x.equals(null) должно быть ложным.
Симметрия: x.equals(y) и y.equals(x) имеют одинаковый результат
Транзитивность: a и b равны, b и c равны, значит, a и c тоже должны быть равны.
Согласованность: в течение определенного времени выполнения изменения в состоянии двух объектов не повлияют на результат решения равных.
hashCode() используется для сужения диапазона поиска.
Перезаписать равно, необходимо также переписать hashCode
Поля, которые участвуют в функции равенства, также должны участвовать в вычислении hashCode.
Эквивалентные (вызов равенства возвращает true) объекты должны создавать один и тот же хэш-код. Неэквивалентные объекты не требуют, чтобы полученные хэш-коды были разными.
Поля, которые измеряют равенство в равных числах, участвуют в операции хэширования. Каждое важное поле генерирует компонент хеш-функции и вносит свой вклад в окончательное значение хеш-функции.
== Определить, равны ли адреса объектов
RPC-аспект
Причина, по которой сериализация и десериализация Protocol Buffer проста и быстра, заключается в том, что
1. Метод кодирования/декодирования прост (только простые математические операции = смещение и т.п.)
2. Для завершения процесса используйте собственный код платформы и компилятор Protocol Buffer.
Причины, по которым Protocol Buffer имеет хороший эффект сжатия данных (то есть объем данных после сериализации невелик):
1. a. Примите уникальный метод кодирования, такой как метод кодирования Varint, Zigzag и т. д.
2. b. Принять метод хранения данных T-L-V: сократить использование разделителей и обеспечить компактность хранения данных.
база данных
Повторяемое чтение INNODB: какие умные способы используются, чтобы избежать фантомного чтения
Чтение снимка представления (неблокирующее чтение), псевдо-MVCC
Встроенный замок следующего ключа с зазором
Необходимо знать о журнале повторов