Pipelining
Тема дорожной карты · Redis
Пайплайнинг Redis позволяет клиенту отправлять несколько команд на сервер без ожидания каждого отдельного ответа, буферизуя все команды и считывая все ответы в одном сетевом круговом обходе. Группа из 100 команд SET в пайплайне выполняется примерно за то же реальное время, что и одна команда SET, поскольку основные затраты определяются сетевой задержкой, а не обработкой сервером. Клиентские библиотеки Redis предоставляют пайплайнинг через менеджер контекста pipeline() (Python redis-py), multi() (node_redis) или аналоги — команды внутри пайплайна ставятся в очередь на стороне клиента и отправляются вместе. Пайплайнинг не обеспечивает гарантий атомарности, как MULTI/EXEC; другие клиенты могут вставлять свои команды между командами в пакете. Сочетание пайплайнинга с MSET/MGET для однородных операций или MULTI/EXEC для атомарности обеспечивает максимальную пропускную способность Redis.
Как это работает
Pipelining батчит несколько команд в один round trip. Без pipelining N команд = N RTT (network latency доминирует для маленьких команд). С pipelining клиент шлёт все N команд, потом читает все N ответов — один RTT на батч. У большинства клиентов есть pipeline() / multi(). Порядок сохраняется; команды всё равно исполняются по очереди на сервере (без атомарности — для неё MULTI/EXEC).
Когда применять
Pipelining — когда есть известный батч независимых команд (bulk insert, multi-get, fan-out write). Прирост throughput в 5-50× типичен для маленьких команд через сеть 1ms. Комбинируйте с MULTI/EXEC для "атомарно + батч". Не пайплайните огромные батчи без flush — память растёт на клиенте.
Типичные ошибки
Ловушки Pipelining: pipelining 1M команд без периодического flush (RAM клиента взрывается); путаница pipelining с транзакциями (без атомарности — конкурентные команды с другого соединения могут вклиниться); error handling, съедающий ошибки в середине pipeline (нужно проверять каждый ответ).