Я Редис, мне 11 лет~
Когда-то я был таким невинным и таким милым, но теперь я предал свою «клятву» и решил без колебаний бежать по дороге многопоточности Да, я милый и очаровательный Redis в твоих устах. Можешь называть меня маленьким Р...Р 😊.
После волны дерзких операций мы приступаем к сегодняшнему тексту.
Мы знаем, что после Redis 4.0 некоторые функции многопоточности были добавлены одна за другой.Разве не хорошо иметь один поток?
Является ли один поток медленным?
Единая нить Redis когда-то была для нас столицей, чтобы хвастаться, а элегантный и эффективный дизайн очаровал бесчисленное количество поклонников.
Вы хотите спросить меня, где я занимаю место?Nginx — мой старший брат, NodeJS — мой младший брат, и я второй ребенок в семье..
Трех наших братьев можно назвать выдающимися представителями однопоточного производства, демонстрирующими не только нашу элегантность, но и нашу эффективность.
🙋♂️ Кто-то может спросить:Почему однопоточный я такой наглый?
В доме есть мины.Основная причина, по которой Redis является однопоточным, но при этом имеет высокую производительностьЕсть следующие моменты:
- На основе операций с памятью: все данные Redis хранятся в памяти, поэтому все операции выполняются на уровне памяти, поэтому его производительность относительно высока;
- Простая структура данных. Структура данных Redis относительно проста, она специально разработана для Redis, а временная сложность поиска и работы с этими простыми структурами данных составляет O(1), поэтому производительность относительно высока;
- Мультиплексирование и неблокирующий ввод-вывод: Redis использует мультиплексирование ввода-вывода для мониторинга нескольких клиентов, подключенных к сокету, так что одно потоковое соединение может использоваться для обработки нескольких запросов, что снижает накладные расходы, вызванные переключением потоков, а также позволяет избежать блокировки ввода-вывода. операций, что значительно повышает производительность Redis;
- Избегайте переключения контекста: поскольку это однопоточная модель, избегаются ненужное переключение контекста и многопоточная конкуренция, что экономит время и потребление производительности, вызванное многопоточным переключением, а один поток не вызывает проблемы взаимоблокировки.
Давайте посмотрим, что мой отец может сказать обо мне. FAQ Redis (часто задаваемые вопросы, часто задаваемые вопросы) отвечает на этот однопоточный вопрос следующим образом:
Redis is single threaded. How can I exploit multiple CPU / cores?
It's not very frequent that CPU becomes your bottleneck with Redis, as usually Redis is either memory or network bound. For instance, using pipelining Redis running on an average Linux system can deliver even 1 million requests per second, so if your application mainly uses O(N) or O(log(N)) commands, it is hardly going to use too much CPU.
However, to maximize CPU usage you can start multiple instances of Redis in the same box and treat them as different servers. At some point a single box may not be enough anyway, so if you want to use multiple CPUs you can start thinking of some way to shard earlier.
You can find more information about using multiple Redis instances in the Partitioning page.
However with Redis 4.0 we started to make Redis more threaded. For now this is limited to deleting objects in the background, and to blocking commands implemented via Redis modules. For future releases, the plan is to make Redis more and more threaded.
Видеть:redis.io/topics/faq
Обычно он имеет в виду, что Redis основан на операциях с памятью, поэтому его узким местом может быть память машины или пропускная способность сети, а не ЦП.Поскольку ЦП не является узким местом, естественно принимается однопоточное решение и многопоточное используются сравнения. Но в Redis 4.0 была поддержана многопоточность, например удаление фона и другие функции.
Короче говоря, есть три основные причины, по которым Redis 4.0 был однопоточным:
- Использование однопоточной модели упрощает разработку и обслуживание Redis, поскольку однопоточная модель удобна для разработки и отладки;
- Даже если используется однопоточная модель, несколько клиентских запросов обрабатываются одновременно, в основном с использованием мультиплексирования и неблокирующего ввода-вывода;
- Для систем Redis основным узким местом производительности является память или пропускная способность сети, а не ЦП.
Зачем нужна многопоточность?
Но один поток также имеет проблемы с одним потоком.Например, когда мне (Redis) нужно удалить большие данные, поскольку это однопоточная синхронная операция, это приведет к зависанию службы Redis, поэтому в Redis 4.0, добавлено много новых.Конечно, модуль Thread, многопоточность в этой версии предназначена в основном для решения проблемы низкой эффективности удаления данных.Его соответствующие инструкции следующие:
- unlink key
- flushdb async
- flushall async
Пример выполнения показан ниже:
> unlink key # 后台删除某个 key
> OK # 执行成功
> flushall async # 清空所有数据
> OK # 执行成功
Таким образом, я могу заблокировать (удалить) этих плохих парней «мгновенно».
Так называемое «мгновенное» удаление на самом деле немного преувеличено, но судя по возвращаемому результату, удаление прошло успешно, но это всего лишь передача работы по удалению младшему брату (подпотоку) в фоновом режиме для удаления данных асинхронно..
Советы: В обычных условиях для быстрого удаления данных можно использовать команду del, но когда удаляемый ключ представляет собой очень большой объект, например набор хэшей, содержащий тысячи элементов, используется команда del. основной поток Redis зависает, поэтому использование ленивого удаления может эффективно избежать проблемы зависания Redis.
Многопоточность в Redis 6
Раньше в Redis 4.0 вы говорили, что удаление происходит медленно, и вы обманывали меня, чтобы открыть большой (многопоточный), чтобы справиться с этим.Почему Redis 6.0 более многопоточный?
На самом деле, хотя многопоточность была введена в версии Redis 4.0, многопоточность в этой версии можно использовать только для асинхронного удаления больших объемов данных, но она не имеет большого значения для операций без удаления.
Но если мы используем многопоточность в неудаляемой среде, мы можем разделить давление синхронного чтения и записи ввода-вывода Redis и в полной мере использовать ресурсы многоядерного ЦП, что может эффективно улучшить Redis QPS (запросов в секунду, т.е. частота запросов в секунду).
Хотя в Redis используется мультиплексирование ввода-вывода и операция основана на неблокирующем вводе-выводе, чтение и запись самого ввода-вывода заблокированы.Например, когда в сокете есть данные, Redis пропустит вызов сначала копирует данные из пространства состояний ядра в пространство состояний пользователя, а затем передает их вызову Redis, и процесс копирования блокируется.Когда объем данных больше, копирование занимает больше времени, и эти операции основаны сделано в одном потоке.
Проще говоря, мультиплексирование ввода-вывода — это механизм, гарантирующий, что неблокирующий ввод-вывод Redis может быть успешно завершен путем отслеживания событий чтения и записи файлов, а затем уведомления потоков о выполнении связанных операций.
следовательноВ Redis 6.0 добавлена функция многопоточности для повышения производительности чтения и записи ввода-вывода. Его основная идея состоит в том, чтобы разделить задачи чтения и записи ввода-вывода основного потока на набор независимых потоков для выполнения, чтобы Чтение и запись нескольких сокетов можно распараллелить, но команды Redis по-прежнему выполняются последовательно основным потоком..
должен быть в курсеRedis 6.0 по умолчанию отключает многопоточность, вы можете изменить файл конфигурации Redis redis.conf, изменивio-threads-do-reads
равныйtrue
Чтобы включить многопоточность, полная конфигурацияio-threads-do-reads true
, в дополнение к этому нам также необходимо установить количество потоков для корректного включения функции многопоточности, а также изменить конфигурацию Redis, например, установитьio-threads 4
Указывает, что открыто 4 потока.
Советы: Что касается настройки количества потоков, официальная рекомендация заключается в том, что если это 4-ядерный процессор, рекомендуемое количество потоков устанавливается на 2 или 3, а если это 8-ядерный процессор, количество threads рекомендуется ставить 6, а количество потоков должно быть меньше ядра машины, количество потоков не максимально возможное.
Что касается производительности Redis, мой отец antirez (автор Redis) упомянул об этом, когда поделился на RedisConf 2019:Функция многопоточного ввода-вывода, представленная в Redis 6, как минимум удваивает производительность.. В стране тоже есть люди4-поточная версия Redis и однопоточная версия Redis использовались для сравнения и тестирования в облаке Alibaba.Было обнаружено, что результаты тестирования в основном соответствовали выводам, сделанным antirez, и производительность могла быть в основном удвоена..
Суммировать
Хотя Redis полагается сам на себя: на основе характеристик работы с памятью, простой структуры данных, мультиплексирования и неблокирующего ввода-вывода, избегания ненужного переключения контекста потока и т. д., он по-прежнему очень быстр в однопоточной среде; но для больших данных Удаление ключа по-прежнему актуально, поэтомуВ Redis 4.0 была введена многопоточность: такие команды, как unlink key/flushall async, в основном используются для удаления данных Redis, а в Redis 6.0 был введен многопоточный ввод-вывод для чтения и записи, так что больше миссии *** *, Redis просто превращает чтение и запись ввода-вывода в многопоточность, а выполнение команд по-прежнему выполняется последовательно основным потоком, поэтому работа Redis в условиях многопоточности не вызовет проблем с безопасностью потоков.
Будь то первоначальный однопоточный дизайн Redis или многопоточный дизайн, противоречащий исходному дизайну, есть только одна цель: сделать Redis все быстрее и быстрее.
Так что Редис все еще не изменился, он все тот же мальчик-гонщик~
последние слова
Оригинальность – это непросто, если вы считаете, что эта статья вам полезна, нажмите на значок "отличный", это самая большая поддержка и поощрение для автора, спасибо.
Подпишитесь на официальный аккаунт «Java Chinese Community» и ответьте на «Галантные товары», чтобы получить 50 оригинальных галантерейных товаров.Топ-лист.