01Redis однопоточный VS многопоточный

Разные версии, разные ситуации

Версий Redis 3.x, 4.x и 6.x много, и архитектуры разных версий тоже разные, не очень строго спрашивать однопоточная версия или нет.

  • Версия 3.x, самая ранняя версия, то есть редис, который все передавали из уст в уста, однопоточный
    • простая структура данных
    • Избегайте накладных расходов на блокировки и переключения контекста
    • Может иметь очень высокий QPS
  • Версия 4.х, строго говоря, не однопоточная, а поток, отвечающий за обработку клиентских запросов, однопоточный, но начинает добавлять какие-то многопоточные вещи (асинхронное удаление) .
    • Из-за проблемы блокировки одного потока первичный ключ вводит многопоточность.
  • После последней версии 6.0.x распрощайтесь с единой нитью во всех впечатлениях и используйте новую многопоточность для решения проблемы.

Как понять единый поток Redis

  • Сетевой ввод-вывод Redis и чтение и запись пары ключ-значение выполняются одним потоком. Когда Redis обрабатывает клиентские запросы, он включает получение (чтение сокета), синтаксический анализ, выполнение, возврат содержимого (запись сокета) и т. д. Обработка основного потока, это так называемая «единая нить». Это также основной процесс Redis для предоставления служб хранения ключей и значений извне.
  • вставьте сюда описание изображения
  • Но другие функции Redis, такие как сохранение, асинхронное удаление, синхронизация данных кластера и т. д., фактически выполняются дополнительными потоками.
    Рабочий поток Redis является однопоточным, но, что касается Redis, он многопоточный;

Основная причина, по которой производительность по-прежнему высока в однопоточную эпоху Redis3.x

  • Операции в памяти: все данные Redis хранятся в памяти, поэтому все операции выполняются на уровне памяти, поэтому его производительность относительно высока;
  • Простая структура данных: структура данных Redis специально разработана, и в большинстве случаев сложность поиска и работы с этими простыми структурами данных составляет O (1), поэтому производительность относительно высока;
  • Мультиплексирование и неблокирующий ввод-вывод: Redis использует функцию мультиплексирования ввода-вывода для мониторинга нескольких клиентов, подключенных к сокету, так что одно потоковое соединение может использоваться для обработки нескольких запросов, уменьшая накладные расходы, вызванные переключением потоков, а также избегая операций ввода-вывода. О блокировка операций
  • Избегайте переключения контекста: поскольку это однопоточная модель, избегаются ненужное переключение контекста и многопоточная конкуренция, что экономит время и потребление производительности, вызванное многопоточным переключением, а однопоточность не вызывает взаимоблокировки возникновения проблем.

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

вставьте сюда описание изображения

  • Его общий смысл заключается в том, что Redis основан на операциях с памятью, поэтому его узким местом может быть память машины или пропускная способность сети, а не ЦП.Поскольку ЦП не является узким местом, то естественно использовать однопоточное решение, а использовать проблемы с многопоточным сравнением. Но в Redis 4.0 стала поддерживаться многопоточность, например удаление фона и другие функции.
  • Есть три основные причины, по которым Redis использовал один поток до версии 4.0.
    • Использование однопоточной модели упрощает разработку и обслуживание Redis, поскольку однопоточная модель удобна для разработки и отладки;
    • Даже если используется однопоточная модель, несколько клиентских запросов обрабатываются одновременно, в основном с использованием мультиплексирования и неблокирующего ввода-вывода;
    • Для систем Redis основным узким местом производительности является память или пропускная способность сети, а не ЦП .

Поскольку однопоточность так хороша, зачем постепенно добавлять многопоточность?

проблема с одним потоком

  • В обычных условиях команду del можно использовать для быстрого удаления данных, но когда удаленный ключ представляет собой очень большой объект, например набор хэшей, содержащий тысячи элементов, команда del приведет к зависанию основного потока Redis.
  • Это самая классическая ошибка эпохи однопоточности redis3.x, головная боль удаления больших ключей, потому что redis однопоточный, del bigKey...
  • Поток будет освобожден после долгого ожидания Это похоже на добавление синхронизированной блокировки.Вы представляете, как программа будет заблокирована при высоком параллелизме?

Как решить

  • Использование отложенного удаления может эффективно избежать проблемы зависания Redis.

    • Например, когда мне (Redis) нужно удалить большой объем данных, поскольку это однопоточная синхронная операция, это приведет к зависанию службы Redis, поэтому в Redis 4.0 был добавлен новый многопоточный модуль. Конечно, в этой версии многопоточность в основном решает проблему низкой эффективности удаления данных.
    • вставьте сюда описание изображения

    • Поскольку Redis обрабатывается одним основным потоком, антирез, отец Redis, всегда подчеркивал, что « Ленивый Redis лучше Redis». cpu time slice), отделить от основного потока redis и позволить подпотоку bio обрабатывать его, что значительно сокращает время блокировки основной строки. Таким образом, уменьшается количество удалений, вызывающих проблемы с производительностью и стабильностью.
  • В Redis 4.0 было введено несколько потоков для реализации таких функций, как асинхронное отложенное удаление данных, но по-прежнему существует только один поток для обработки запросов на чтение и запись, поэтому в узком смысле это все еще один поток.

Введение в многопоточность и мультиплексирование ввода-вывода в redis6

  • Основным узким местом производительности Redis является пропускная способность памяти или сети, а не ЦП.
  • Наконец, узкое место Redis можно изначально определить как: сетевой ввод-вывод
  • Пять моделей ввода-вывода в сетевом программировании Unix
    • Блокировка ввода-вывода - Блокировка ввода-вывода
    • NoneBlocking IO - неблокирующий ввод-вывод
    • Мультиплексирование ввода-вывода - мультиплексирование ввода-вывода
      • Это своего рода модель ввода-вывода, то есть классический режим проектирования Reactor, мультиплексирование ввода-вывода, проще говоря, путем отслеживания событий чтения и записи файла, а затем уведомления потока о выполнении связанных операций, чтобы убедиться, что неблокирующие механизмы ввода-вывода Redis могут обеспечить плавное завершение выполнения.
      • Multi-way относится к множественным соединениям сокетов.
      • Мультиплексирование относится к мультиплексированию потока. Существует три основных технологии мультиплексирования: select, poll, epoll.
      • epoll — это новейшая и лучшая технология мультиплексирования. Использование технологии множественного мультиплексирования ввода-вывода позволяет одному потоку эффективно обрабатывать несколько запросов на подключение (минимизируя затраты времени на сетевой ввод-вывод) , а Redis очень быстро оперирует данными в памяти (операции в памяти не станут здесь узким местом производительности), в основном два вышеупомянутых момента делают Redis высокой пропускной способностью.
    • ввод-вывод, управляемый сигналом - ввод-вывод, управляемый сигналом
    • асинхронный ввод-вывод - асинхронный ввод-вывод
  • краткое описание
    • Рабочий поток Redis является однопоточным, но, что касается Redis, он многопоточный;
    • Чтение и запись самого ввода-вывода блокируется, например, когда в сокете есть данные, Redis сначала скопирует данные из пространства режима ядра в пространство пользовательского режима, вызвав, а затем передаст их Redis для Процесс копирования блокируется Да, чем больше объем данных, тем больше времени требуется для копирования, и все эти операции основаны на одном потоке.
    • В Redis 6.0 добавлена ​​новая многопоточная функция для повышения производительности операций ввода-вывода при чтении и записи. Ее основная идея реализации состоит в том, чтобы разделить задачи чтения и записи ввода-вывода основного потока на группу независимых потоков для выполнение, так что Чтение и запись нескольких сокетов могут быть распараллелены.Использование технологии множественного мультиплексирования ввода-вывода позволяет одному потоку эффективно обрабатывать несколько запросов на подключение (минимизировать время, затрачиваемое на сетевой ввод-вывод), и максимальное время- потребление Socket read , анализ запроса и запись передаются на аутсорсинг отдельно, а выполнение оставшейся команды по-прежнему выполняется последовательно основным потоком и взаимодействует с данными в памяти.
    • вставьте сюда описание изображения
    • Объединяя приведенный выше рисунок, мы видим, что операция сетевого ввода-вывода становится многопоточной, а другие основные части по-прежнему ориентированы на многопотоковое исполнение, что является хорошим компромиссом.

Включает ли Redis 6.0 многопоточность по умолчанию?

  • Redis помещает все данные в память, а время отклика памяти составляет около 100 наносекунд.Для небольших пакетов данных сервер Redis может обрабатывать QPS от 8 Вт до 10 Вт, что также является пределом обработки Redis.Для 80% компаний, однопоточного Redis достаточно.
  • В Redis6.0 механизм многопоточности по умолчанию отключен, если вам нужно использовать функцию многопоточности, вам нужно выполнить две настройки в redis.conf
  • вставьте сюда описание изображения
    • Установите для элемента конфигурации io-thread-do-reads значение yes, чтобы запустить многопоточность.
    • Установите количество потоков. Что касается настройки количества потоков, официальное предложение состоит в том, что если это 4-ядерный процессор, рекомендуется установить количество потоков на 2 или 3. Если это 8-ядерный процессор, рекомендуется установите количество потоков равным 6. Количество потоков должно быть меньше, чем количество ядер машины.Больше не всегда лучше.

Подведем итог

  • Redis превосходен в своем дебюте, основываясь на таких функциях, как работа с памятью, простая структура данных, мультиплексирование и неблокирующий ввод-вывод, а также избегая ненужного переключения контекста потока, он по-прежнему быстр в однопоточной среде;
  • Однако удаление ключа больших данных по-прежнему происходит с большой задержкой, поэтому в Redis 4.0 представлены такие команды, как многопоточная асинхронная отвязка ключа/очистки, которые в основном используются для асинхронного удаления данных Redis;
  • В Redis 6.0 введено многопоточное чтение и запись ввода-вывода, чтобы можно было обрабатывать больше задач более эффективно.Redis просто превращает чтение и запись ввода-вывода в многопоточность, а выполнение команд по-прежнему выполняется основной поток выполняется последовательно, поэтому работа Redis в многопоточном режиме не вызовет проблем с безопасностью потоков.
  • Будь то первоначальный однопоточный дизайн Redis или многопоточный дизайн, противоречащий исходному дизайну, есть только одна цель: сделать Redis все быстрее и быстрее.
  • Так что Редис все еще не изменился, он все тот же мальчик, каким был раньше, O(∩_∩)О, ха-ха~

Guess you like

Origin blog.csdn.net/m0_56709616/article/details/130929376