1. Почему Redis является однопоточным?
Примечание. Однопоточность Redis означает, что модуль сетевых запросов использует один поток, то есть один поток обрабатывает все сетевые запросы, а другие модули по-прежнему используют несколько потоков.
Потому что ЦП не является узким местом Redis. Узким местом Redis, скорее всего, будет машинная память или пропускная способность сети.Поскольку однопоточность легко реализовать и ЦП не станет узким местом, логично использовать однопоточное решение. Что касается производительности redis, то на официальном сайте она тоже есть, обычные ноутбуки легко справляются с сотнями тысяч запросов в секунду.
2. Почему Redis такой быстрый
1. Он полностью основан на памяти, и большинство запросов — это операции с чистой памятью, которые выполняются очень быстро. Данные хранятся в памяти аналогично HashMap, преимущество HashMap в том, что временная сложность поиска и работы O(1);
2. Структура данных проста, и операции с данными также просты.Структура данных в Redis специально разработана;
3. Использование одного потока позволяет избежать ненужного переключения контекста и условий конкуренции, а также нет потребления ЦП из-за переключения, вызванного многопроцессорностью или многопоточностью. Нет необходимости рассматривать различные проблемы с блокировкой. Нет операции снятия блокировки. Потребление производительности из-за возможных взаимоблокировок;
4. Используйте модель мультиплексирования множественного ввода-вывода, неблокирующий ввод-вывод;
5. Используются разные базовые модели, и базовые методы реализации и протоколы приложений для связи с клиентами разные.Redis напрямую сам строит механизм ВМ, потому что если общая система вызывает системные функции, то она будет тратить определенное количество времени на ход и запросы;
3. Многоканальная модель мультиплексирования ввода-вывода, неблокирующий ввод-вывод.
Давайте возьмем пример для моделирования TCP-сервера, обрабатывающего 30 клиентских сокетов. Предположим, вы наблюдатель, который просит 30 учащихся ответить на вопрос конкурса, а затем отвечает за прием бланков ответов учащихся. У вас есть следующие варианты:
- Первый вариант: проверяйте по порядку, сначала проверяйте А, затем В, затем С, D. . . Если один ученик застрянет посредине, весь класс задержится. Этот режим похож на то, что вы используете цикл для обработки сокетов один за другим, и возможности параллелизма вообще нет.
- Второй вариант: вы создаете 30 аватаров, и каждый аватар проверяет правильность ответа ученика. Это похоже на создание процесса или потока для каждого пользователя для обработки соединения.
- Третий вариант, вы стоите на трибуне и ждете, кто закончит ответ, поднимает руку. В это время C и D поднимают руки, показывая, что они закончили отвечать на вопрос.Вы спускаетесь вниз, чтобы проверить ответы C и D по очереди, а затем продолжаете возвращаться к трибуне и так далее. В это время Е и А снова поднимают руки, а затем идут разбираться с Е и А. . . Это модель мультиплексирования ввода-вывода, и выбор, опрос и epoll в Linux делают это. Зарегистрируйте fd, соответствующий пользовательскому сокету, в epoll, и тогда epoll поможет вам отслеживать, на какие сокеты приходят сообщения, что позволяет избежать множества бесполезных операций. Сокет в это время должен находиться в неблокирующем режиме. Таким образом, весь процесс будет заблокирован только при вызове таких вызовов, как select, poll и epoll. Отправка и получение клиентских сообщений не будут блокироваться, и весь процесс или поток будет полностью использован. так называемый реакторный режим.
Для приведенного выше примера это выражается в Redis как
Существует 30 клиентов Redis (экзаменаторов) для поддержания TCP-соединения с модулем сетевого подключения (проктором) сервера Redis. Клиент будет время от времени отправлять запросы на сервер. Когда клиент Redis инициирует запрос, он инициирует система unix, такая как epoll. Для такого системного вызова модуль мультиплексирования ввода-вывода Redis инкапсулирует базовую функцию мультиплексирования ввода-вывода, такую как epoll, а затем перенаправляет ее соответствующему обработчику событий.
Обработчик файловых событий использует модуль мультиплексирования ввода-вывода для одновременного мониторинга нескольких FD (файловых дескрипторов). устройство ФД.
Несмотря на то, что весь процессор файловых событий работает в одном потоке, введение модуля мультиплексирования ввода-вывода обеспечивает одновременный мониторинг нескольких операций чтения и записи FD, повышает производительность модели сетевой связи, а также может обеспечить простоту всей реализации службы Redis.