Автор: Внутренний монолог программиста
Источник: Тутиао
Почти во всех интервью, связанных с Java, будут задавать вопросы о кэшировании.В основных будут спрашивать, что такое «закон 28», что такое «горячие данные и холодные данные», а в более сложных будут спрашивать о лавине кеша и проникновении в кеш. предварительный нагрев, обновление кеша, понижение кеша и другие проблемы, эти, казалось бы, необычные понятия связаны с нашим сервером кеша.Как правило, обычно используемые серверы кеша включают Redis, Memcached и т. д., а автор чаще всего использует только Redis. вроде, как бы, что-то вроде.
Если вы не встречали интервьюера на предыдущих собеседованиях и не спрашивали вас: «Почему Redis однопоточный и почему Redis такой быстрый?» ", то когда вы читаете эту статью, вы должны думать, что это очень повезло! Если вам посчастливилось быть высококлассным интервьюером, вы также можете использовать этот вопрос, чтобы взять интервью у «смотрящего в осенние воды» на противоположной стороне, чтобы проверить его мастерство.
Хорошо! Ближе к делу! Давайте сначала обсудим, что такое Redis, почему Redis такой быстрый, а затем почему Redis однопоточный?
1. Введение в Redis
Redis — это система хранения данных в памяти с открытым исходным кодом, которую можно использовать в качестве: базы данных, кэша и промежуточного программного обеспечения сообщений.
Он поддерживает несколько типов структур данных, таких как String, Hash, List, Set, Sorted Set или ZSet и запросы диапазона, Bitmaps, Hyperloglogs и запрос радиуса геопространственного индекса. Среди них распространенными типами структур данных являются: String, List, Set, Hash и ZSet.
Redis имеет встроенную репликацию (Replication), сценарии LUA (сценарии Lua), события, управляемые LRU (выселение LRU), транзакции (Transactions) и различные уровни сохраняемости диска (Persistence), а также через Redis Sentinel (Sentinel) и автоматический раздел. (кластер)) для обеспечения высокой доступности.
Redis также предоставляет параметры сохранения, которые позволяют пользователям сохранять свои данные на диск для хранения. В зависимости от реальной ситуации набор данных может быть экспортирован на диск (моментальный снимок) через равные промежутки времени или добавлен в журнал команд (AOF добавляет только файлы).При выполнении команды записи он скопирует выполненную команду записи на жесткий диск. диск. . Вы также можете отключить функцию сохранения и использовать Redis в качестве эффективной функции данных сетевого кэша.
Redis не использует таблицы, и его база данных не предопределяет и не заставляет пользователей связывать различные данные, хранящиеся в Redis.
Режим работы базы данных можно разделить на: базу данных на жестком диске и базу данных в памяти в соответствии с режимом хранения. Redis хранит данные в памяти, при чтении и записи данных он не ограничен скоростью ввода/вывода жесткого диска, поэтому он чрезвычайно быстр.
(1) Режим работы базы данных жесткого диска:
(2) Режим работы встроенной в память базы данных:
Прочитав приведенное выше описание, знаете ли вы некоторые распространенные вопросы, связанные с Redis, такие как: что такое Redis, каковы распространенные типы структур данных в Redis, как Redis сохраняется и т. д.
2. Насколько быстр Redis?
Redis использует базу данных KV на основе памяти, в которой используется однопоточная модель с одним процессом, написанная на языке C, а официальные данные — это QPS (запросы в секунду), которые могут достигать 100 000+.
Эти данные ничуть не хуже, чем та же база данных KV на памяти Memcached с однопроцессорной многопоточностью!
Горизонтальная ось — это количество подключений, а вертикальная ось — количество запросов в секунду. На данный момент эта картина отражает порядок.Надеюсь каждый сможет правильно описать ее в ходе интервью.Когда я не спрашиваю вас,порядок вашего ответа далек от этого!
3. Почему Redis такой быстрый?
1. Он полностью основан на памяти, и большинство запросов — это операции с чистой памятью, которые выполняются очень быстро. Данные хранятся в памяти аналогично HashMap, преимущество HashMap в том, что временная сложность поиска и работы O(1);
2. Структура данных проста, и операции с данными также просты.Структура данных в Redis специально разработана;
3. Использование одного потока позволяет избежать ненужного переключения контекста и условий конкуренции, а также нет потребления ЦП из-за переключения, вызванного многопроцессорностью или многопоточностью. Нет необходимости рассматривать различные проблемы с блокировкой. Нет операции снятия блокировки. Потребление производительности из-за возможных взаимоблокировок;
4. Используйте модель мультиплексирования множественного ввода-вывода, неблокирующий ввод-вывод;
5. Используются разные базовые модели, и базовые методы реализации и протоколы приложений для связи с клиентами разные.Redis напрямую сам строит механизм ВМ, потому что если общая система вызывает системные функции, то она будет тратить определенное количество времени на ход и запросы;
Вышеизложенные пункты легко понять.Ниже мы кратко обсудим модель многоканального мультиплексирования ввода/вывода:
(1) Мультиплексная модель мультиплексирования ввода/вывода
Модель многоканального мультиплексирования ввода/вывода – это возможность использовать выбор, опрос и epoll для одновременного мониторинга событий ввода/вывода нескольких потоков. При бездействии текущий поток будет заблокирован. Когда один или несколько потоков Иметь события ввода-вывода Когда происходит событие /O, оно выходит из состояния блокировки, поэтому программа будет опрашивать все потоки (epoll опрашивает только те потоки, которые фактически генерируют события) и последовательно обрабатывать только готовые потоки. Такой подход позволяет избежать многих бесполезных операций.
Здесь «мультиплексирование» относится к нескольким сетевым соединениям, а «мультиплексирование» относится к мультиплексированию одного и того же потока.
Использование технологии многоканального мультиплексирования ввода-вывода позволяет одному потоку эффективно обрабатывать несколько запросов на подключение (минимизируя время, затрачиваемое на сетевой ввод-вывод), а Redis очень быстро обрабатывает данные в памяти, а это означает, что операции в памяти не выполняются. станет узким местом, влияющим на производительность Redis.Вышеуказанные моменты делают Redis высокой пропускной способностью.
4. Так почему же Redis однопоточный?
Мы должны сначала понять, что приведенный выше анализ предназначен для создания быстрой атмосферы для Redis! В официальном FAQ говорится, что, поскольку Redis — это операция, основанная на памяти, ЦП не является узким местом Redis, а узким местом Redis, скорее всего, является размер машинной памяти или пропускная способность сети. Так как однопоточность легко реализуема, а ЦП не будет узким местом, логично использовать однопоточное решение (ведь использование нескольких потоков доставит массу хлопот!).
Увидев это, вы можете заплакать! Я думал, что будут некоторые важные технические моменты, которые заставят Redis использовать один поток для такой быстрой работы, но я не ожидал, что это будет официальный ответ, который, похоже, нас одурачит! Однако мы уже можем внятно объяснить, почему Redis такой быстрый, а поскольку он и так быстр в однопоточном режиме, нет необходимости использовать многопоточность!
Однако то, как мы используем один поток, не может воспроизвести производительность многоядерного процессора, но мы можем улучшить ее, открыв несколько экземпляров Redis на одной машине!
Предупреждение 1: Единственный поток, который мы здесь подчеркиваем, — это только один поток для обработки наших сетевых запросов. Формальный сервер Redis должен работать с более чем одним потоком. Здесь вам нужно обратить внимание! Например, когда Redis сохраняется, он будет выполняться в виде подпроцесса или подпотока (в частности, будет ли читатель дополнительно изучать подпоток или подпроцесс); например, я просматриваю Redis процесс на тестовом сервере, а затем найдите поток под процессом:
Параметр «-T» команды ps указывает поток отображения (показать потоки, возможно, со столбцом SPID). Столбец «SID» указывает идентификатор потока, а столбец «CMD» указывает имя потока.
Предупреждение 2: В последнем абзаце FAQ на рисунке выше указано, что многопоточность будет поддерживаться, начиная с Redis 4.0, но многопоточные операции выполняются только на определенных операциях! Так что читатели должны проверить, является ли эта статья по-прежнему однопоточной в будущих версиях!
5. Внимание
1. Мы знаем, что Redis использует "модель ввода-вывода с однопоточным мультиплексированием" для достижения высокопроизводительных служб данных в памяти. Этот механизм позволяет избежать использования блокировок, но в то же время этот механизм требует больше времени в процесс sunion и тому подобное команда уменьшит параллелизм redis.
Поскольку это один поток, одновременно выполняется только одна операция, поэтому трудоемкие команды приведут к снижению параллелизма, не только параллелизма чтения, но и параллелизма записи. Один поток может использовать только одно ядро ЦП, поэтому несколько экземпляров могут быть запущены на одном и том же многоядерном сервере для формирования формы «ведущий-ведущий» или «ведущий-ведомый», а трудоемкие команды чтения могут выполняться полностью на ведомом устройстве.
Элементы redis.conf, которые необходимо изменить:
pidfile /var/run/redis/redis_6377.pid #pidfile должен добавить номер порта
порт 6377 # Это должно быть изменено
logfile /var/log/redis/redis_6377.log # Имя файла журнала также добавляет номер порта
dbfilename dump_6377.rdb #rdbfile также добавьте номер порта
2. «Мы не можем позволить операционной системе сбалансировать нагрузку, потому что мы лучше знаем свои собственные программы, поэтому мы можем вручную назначать им ядра ЦП, не занимая слишком много ЦП, или позволить нам ключевые процессы и кучу других процессов. сбились в кучу».
ЦП является важным фактором, и из-за однопоточной модели Redis предпочитает быстрые ЦП с большим кэшем, а не многоядерным.
На серверах с многоядерными ЦП производительность Redis также зависит от конфигурации NUMA и расположения привязки процессора. Наиболее очевидный эффект заключается в том, что redis-benchmark будет случайным образом использовать ядра ЦП. Для получения точных результатов требуется инструмент с фиксированным процессором (задача доступна в Linux). Самый эффективный способ — разделить клиент и сервер на два разных процессора, чтобы использовать кеш L3.
6. Расширение
Вот несколько моделей, которые вы должны знать, и удачи вам на собеседованиях!
1. Однопроцессная многопоточная модель: MySQL, Memcached, Oracle (версия для Windows);
2. Многопроцессная модель: Oracle (версия для Linux);
3. Nginx имеет два типа процессов, один из которых называется процессом Master (эквивалентен процессу управления), а другой называется процессом Worker (фактический рабочий процесс). Есть два способа начать:
(1) Запуск одного процесса: в настоящее время в системе существует только один процесс, который действует как роль главного процесса, так и роль рабочего процесса.
(2) Запуск нескольких процессов: в настоящее время в системе есть один и только один главный процесс, и работает по крайней мере один рабочий процесс.
(3) Процесс Master в основном выполняет некоторую глобальную работу по инициализации и управляет работой Worker, обработка событий выполняется в Worker.