1. В чем разница между memcached и Redis?
(1) Redis поддерживает операции с данными на стороне сервера.
По сравнению с Redis и memcached, у Redis большеСтруктуры данных и поддержка более сложных манипуляций с данными, Обычно в memcached нужно передать данные клиенту для модификации типа и потом выставить обратно, что серьезно увеличит количество сетевых IO и объем данных. В Redis эти операции можно выполнять на стороне сервера, поэтому эти сложные операции столь же эффективны, как обычные GET/SET. Итак, если вам нужен кеш для поддержки более сложных структур и операций, то Redis — хороший выбор.
(2) Использование памяти
Если используется простое хранилище «ключ-значение», использование памяти Memcached будет выше, а если Redis использует хэш-структуру для хранения «ключ-значение», использование памяти будет выше, чем у Memcached, из-за комбинированного сжатия.
(3) Производительность
Поскольку Redis использует только одно ядро, а Memcached может использовать несколько ядер, в среднем Redis имеет лучшую производительность, чем Memcached, при хранении небольших данных на каждом ядре. На данных выше 100К производительность Memcached выше, чем у Redis.
(4) Кластерный режим
Memcached не имеет собственного режима кластера, и ему необходимо полагаться на клиента для реализации сегментирования в кластере для записи данных; Redis изначально поддерживает режим кластера и официально поддерживает кластерный режим кластера Redis.
Контрастная точка | memcached | redis |
---|---|---|
Поддерживать ли операции на стороне сервера | не поддерживается | служба поддержки |
тип структуры данных | Простой | сложный и разнообразный |
использование памяти | Простое хранилище ключей и значений с высокой степенью использования | Хранение хеш-структуры, высокая загрузка памяти |
представление | Высокая производительность для хранения больших данных | Высокая производительность для хранения небольших данных |
кластерный режим | нет родной поддержки | Встроенная поддержка режима кластера |
2. Режим потока Redis?
Чтобы понять режим многопоточности Redis, вы должны сначала понять следующие концепции.
(1) Обработчик файловых событий
① Модель реактора Redis основана на разработке сетевого обработчика событий, этот обработчик называется обработчиком событий документа (файловый обработчик событий). Этот обработчик событий файла является однопоточным, поэтому redis называется однопоточным режимом, используя механизм мультиплексирования ввода-вывода для одновременного мониторинга нескольких сокетов, выбирая соответствующий обработчик событий в соответствии с событием на сокете для обработки этого события.
② Если контролируемый сокет готов к выполнению таких операций, как прием, чтение, запись, закрытие и т. д., будет сгенерировано событие файла, соответствующее операции, и файловый процессор вызовет ранее связанный обработчик событий для обработки этого события. .
③Обработчик файловых событий работает в однопоточном режиме, но благодаря механизму мультиплексирования ввода-вывода для мониторинга нескольких сокетов может быть достигнута высокопроизводительная модель сетевой связи, и он может быть связан с другими внутренними однопоточными модулями, обеспечивая внутреннее перераспределение. Простота потоковой модели.
④Структура обработчика файловых событий состоит из четырех частей: несколько сокетов, мультиплексор ввода-вывода, диспетчер файловых событий, обработчик событий (обработчик запроса команды, обработчик ответа команды, обработчик ответа соединения и т. д.).
⑤ Несколько сокетов могут генерировать разные операции одновременно, и каждая операция соответствует разным файловым событиям, но мультиплексор ввода-вывода будет прослушивать несколько сокетов, но будет помещать сокеты в очередь для обработки, и каждый раз из очереди вынимать сокет в диспетчер событий, и диспетчер событий отправляет сокет соответствующему обработчику событий.
⑥ Затем, после обработки события сокета, мультиплексор ввода/вывода отправит диспетчеру событий следующий сокет в очереди. Диспетчер событий выберет соответствующий обработчик событий для обработки в соответствии с событием, генерируемым в данный момент каждым сокетом.
(2) Файловые события
① Когда сокет становится доступным для чтения (например, клиент выполняет операцию записи на Redis или операцию закрытия) или когда появляется новый сокет, на который можно ответить (клиент Redis выполняет операцию подключения), сокет генерирует AE_READABLE. мероприятие.
② Когда сокет становится доступным для записи (клиент выполняет операцию чтения на Redis), сокет генерирует событие AE_WRITABLE.
③Программа мультиплексирования ввода-вывода может одновременно отслеживать события AE_READABLE и AE_WRITABLE.Если сокет имеет эти два события одновременно, распределитель файлов сначала обработает событие AE_READABLE, а затем событие AE_WRITABLE.
(3) Обработчик файловых событий
Если клиент хочет подключиться к Redis, он подключит обработчик ответов для ассоциации сокетов.
Если клиент хочет записать данные в Redis, он запросит обработчик команды ассоциации сокетов.
Если клиент хочет прочитать данные из Redis, он ответит процессору на команду ассоциации сокетов.
① Когда redis запускается и инициализируется, redis связывает обработчик ответа на соединение с событием AE_READABLE, а затем, если клиент инициирует соединение с redis, redis в это время сгенерирует событие AE_READABLE, а затем обработчик ответа на соединение обработает соединение с событием AE_READABLE. Клиент устанавливает соединение, создает сокет, на который отвечает клиент, и связывает событие AE_READABLE этого сокета с обработчиком командного запроса.
②Когда клиент инициирует запрос к redis (будь то запрос на чтение или запрос на запись, это одно и то же), сначала в сокете генерируется событие AE_READABLE, а затем обрабатывается соответствующим обработчиком запросов команд. Этот обработчик запроса команды будет считывать запрошенные данные из сокета, а затем выполнять операции и обработку.
③ После того, как сторона redis подготовит данные ответа для клиента, она свяжет событие AE_WRITABLE сокета с обработчиком ответа на команду.Когда сторона клиента будет готова прочитать соответствующие данные, она сгенерирует сокет на сокете. Событие AE_WRITABLE будет обработано соответствующим обработчиком ответов на команды, то есть подготовленные данные ответа будут записаны в сокет для чтения клиентом.
④После записи обработчика ответов на команды связь между событием AE_WRITABLE сокета и обработчиком ответов на команды будет удалена.
3. Почему однопоточный Redis может поддерживать высокий параллелизм?
(1) Работа с чистой памятью.
(2) Ядро основано на неблокирующем механизме мультиплексирования ввода-вывода.
(3) Один поток позволяет избежать накладных расходов на многопоточное переключение контекста.