резьбовая модель
Все знают, что Redis однопоточный, почему однопоточный Redis такой быстрый? Далее разбираем причины.
строго говоря, Redis Server является многопоточным,Просто весь процесс обработки его запросов однопоточный. Мы должны четко понимать этот момент, не думайте просто, что Redis Server однопоточный.
Производительность Redis очень высока, и он может выдерживать 10W+ QPS в секунду, Его превосходная производительность в основном зависит от следующих аспектов:
- Большинство операций Redis выполняются в памяти.
- Использование механизма мультиплексирования ввода-вывода
- задачи, не требующие интенсивного использования процессора
- Преимущества одиночного потока
1. Чистая работа с памятью
Redis — это база данных в памяти, и ее данные хранятся в памяти, что означает, что мы читаем и записываем данные в память, что очень быстро.
Нижний уровень Redis использует эффективные структуры данных, такие как хэш-таблицы и таблицы переходов, что является важной причиной его высокой производительности.
2. Использование механизма мультиплексирования ввода-вывода
Redis разработал собственный обработчик сетевых событий на основе шаблона Reactor: этот обработчик называется обработчиком файловых событий. Обработчики файловых событий используют процедуру мультиплексирования ввода-вывода для одновременного прослушивания нескольких сокетов и связывают разные обработчики событий для сокетов в зависимости от того, что сокеты делают в данный момент.
Когда контролируемый сокет готов к выполнению таких операций, как принятие, чтение, запись, закрытие и т. д., будет сгенерировано событие файла, соответствующее операции. для обработки этих событий.
Хотя обработчик файловых событий работает в однопоточном режиме, используя мультиплексор ввода-вывода для прослушивания нескольких сокетов, обработчик файловых событий реализует высокопроизводительную модель сетевого взаимодействия и хорошо работает с другими модулями на сервере Redis, которые также выполняемые в однопоточном режиме, связаны, что поддерживает простоту однопоточного дизайна в Redis.
3. Задачи, не требующие интенсивного использования ЦП
Недостаток использования одного потока очевиден, и он не может использовать многоядерный процессор. Автор Redis упомянул, что, поскольку большинство операций Redis не требуют интенсивной загрузки ЦП, узким местом Redis является память и пропускная способность сети.
При большом количестве одновременных запросов Redis требуется больше памяти и более высокая пропускная способность сети, в противном случае узким местом, вероятно, будет нехватка памяти и ожидание задержки в сети.
Конечно, если вы чувствуете, что производительности одного экземпляра Redis недостаточно для поддержки бизнеса, автор Redis рекомендует развернуть несколько узлов Redis для формирования кластера, чтобы использовать мощность многоядерных процессоров, а не использовать несколько потоков на одном сервере. один экземпляр для обработки.
4. Преимущество однорепенного
Основываясь на приведенных выше характеристиках, Redis использует один поток для достижения очень высокой производительности, поэтому Redis не использует многопоточную модель.
Кроме того, однопоточная модель имеет следующие преимущества:
- Избегайте потери производительности, вызванной многопоточным переключением контекста.
- Избегайте потери производительности, вызванной многопоточным доступом к блокировке общих ресурсов.
Таким образом, Redis основан на вышеуказанных преимуществах, поэтому он принимает однопоточную модель для выполнения работы по обработке запросов.
5. Недостатки одинарного потока
Самый большой недостаток однопоточной обработки заключается в том, чтоЕсли предыдущий запрос занимал много времени, то весь Redis будет заблокирован, и другие запросы не смогут поступать. Пока эта трудоемкая операция не будет обработана и возвращена, другие запросы не могут быть обработаны.
Обычно мы сталкиваемся с проблемой, что Redis медленно отвечает или долго блокируется, большинство из которых вызвано тем, что Redis обрабатывает запросы в однопоточном режиме.
Итак, когда мы используем Redis,Обязательно избегайте очень трудоемких операцийНапример, использование метода со слишком высокой временной сложностью для получения данных, получение слишком большого количества данных за один раз, большое количество ключей с истекшим сроком действия в централизованном порядке, а также увеличение нагрузки на Redis для устранения ключей и т. д. Эти сценарии заблокирует весь поток обработки до тех пор, пока они не будут обработаны. Это повлияет на доступ к бизнесу.
6. Оптимизация многопоточности
Redis Server является многопоточным.Помимо однопоточного процесса обработки запросов, внутри Redis есть другие рабочие потоки, которые выполняются в фоновом режиме.Он отвечает за асинхронное выполнение некоторых трудоемких задач, таких как сброс дисков AOF в секунду, все файлы AOF перезаписываются в другом потоке.
После Redis 4.0 Redis представил механизм lazyfree, предоставляя такие команды, как unlink, flush aysc, flushdb async, а также такие механизмы, как lazyfree-lazy-eviction и lazyfree-lazy-expire для асинхронного освобождения памяти.Большие данные в памяти вызывают проблемы с производительностью при блокировке. всего редис.
При удалении больших ключей часто требуется много времени на освобождение памяти, поэтому Redis предоставляет способ асинхронного освобождения памяти, чтобы эти трудоемкие операции можно было обрабатывать асинхронно в другом потоке, чтобы не влиять на выполнение основного потока и улучшить производительность.
В Redis 6.0 Redis представила многопоточность для завершения анализа протокола данных запроса, что еще больше повысило производительность. В основном это устраняет нагрузку, вызванную однопоточным протоколом данных запроса синтаксического анализа в сценариях с высоким уровнем параллелизма. После того, как анализ протокола данных запроса завершен несколькими потоками, последующий этап обработки запроса все еще ставится в очередь для обработки одним потоком.
Видно, что Redis не думает консервативно о том, насколько хорош один поток, и не вводит многопоточность для использования многопоточности. Автор Redis очень четко понимает сценарии использования однопоточной и многопоточной обработки и соответственно оптимизирует их.