В настоящее время я пытаюсь понять некоторые основные моменты реализации Redis. Я знаю, что redis является однопоточным, и я уже наткнулся на следующий вопрос: Redis является однопоточным, тогда как он выполняет одновременный ввод-вывод?

Но я все еще думаю, что не понял этого правильно. Afaik Redis использует шаблон реактора, используя один единственный поток. Итак, если я правильно понял, существует наблюдатель (который обрабатывает FD / входящие / исходящие соединения), который делегирует работу своим зарегистрированным обработчикам событий. Они выполняют фактическую работу и устанавливают, например. их ответы как событие для наблюдателя, который передает ответ обратно клиентам. Но что произойдет, если запрос (R1) клиента займет, скажем, около 1 минуты. Другой Клиент создает еще один (быстрый) запрос (R2). Затем, поскольку redis является однопоточным, R2 не может быть делегирован правому обработчику, пока R1 не будет завершен, верно? В многопоточной среде вы можете просто запускать каждый обработчик в одном потоке, поэтому «основной» поток просто принимает и отвечает на соединения io, а вся остальная работа выполняется в собственных потоках.

Если он действительно просто ставит в очередь обработку io и логику обработчика, он никогда не сможет быть таким быстрым. Что мне здесь не хватает?

1
Alexander Mayr 30 Дек 2017 в 19:17

2 ответа

Лучший ответ

Вы ничего не упускаете, кроме, возможно, того факта, что большинство операций в Redis завершаются менее чем за ~ миллисекунду ~ пару микросекунд. Действительно, длительные операции блокируют сервер во время их выполнения.

3
Itamar Haber 31 Дек 2017 в 00:02

Предположим, что если бы было 10000 пользователей, выполняющих извлечение данных в реальном времени по 10 секунд каждый на hmget, а с другой стороны, сервер осуществлял широковещательную передачу с использованием hmset, redis может выдавать набор только в последней доступной очереди.

Redis хорош только для постановки в очередь и обработки ограниченной обработки, такой как вставка ленивой информации о последнем входе в систему, но не для трансляции информации в реальном времени, в этом случае memcached будет правильным выбором. Redis является однопоточным, как и FIFO.

0
Nicholas yau 24 Авг 2018 в 21:05