Pipelining - это коммуникационная стратегия на уровне протокола, которая не имеет ничего общего с атомарностью.Оно полностью ортогонально понятию «транзакции».(Например, вы можете использовать MULTI .. EXEC
в конвейерном соединении.)
Что такое конвейер?
Самым основным соединителем для redis будет синхронный клиент, взаимодействующий в режиме запрос-ответ,Клиент отправляет запрос, а затем ждет ответа от Redis перед отправкой следующего запроса.
При конвейерной обработке клиент может продолжать отправлять запросы, не останавливаясь, чтобы увидеть ответ Redis на каждый запрос.Redis, конечно, является однопоточным сервером и естественной точкой сериализации, и, таким образом, порядок запросов сохраняется и отражается в порядке ответов.Это означает, что клиент может иметь один поток, отправляющий запросы (обычно путем удаления из очереди запросов), а другой поток постоянно обрабатывает ответы от Redis.Обратите внимание, что, конечно, вы все равно можете использовать конвейерную обработку с однопоточным клиентом, но вы теряете некоторые преимущества.Двухпоточная модель позволяет полностью использовать ваш локальный процессор и пропускную способность сети (например, насыщение).
Если вы следите за этим до сих пор, вы должны спросить себя: хорошо, как запрос и ответы совпадают на стороне клиента?Хороший вопрос!Есть разные способы подойти к этому.В JRedis я обертываю запросы в объект (java) Future
, чтобы справиться с асинхронностью обработки запроса / ответа.Каждый раз, когда отправляется запрос, соответствующий объект Future оборачивается ожидающим объектом ответа и ставится в очередь.Прослушиватель ответов просто извлекает из этого элемента очереди 1 за раз, анализирует ответ (поток) и обновляет будущий объект.
Теперь конечный пользователь клиента может быть подключен к синхронному или асинхронному интерфейсу.,Если интерфейс является синхронным, реализация, естественно, должна блокировать ответ Future.
Если вы уже выполнили это, то должно быть ясно, что однопоточное приложение, использующее синхронную семантику с конвейерной обработкой, отрицательно сказывается на всей цели конвейерной обработки (поскольку приложение блокирует ответ и не загружает клиентадополнительные запросы.) Но если приложение является многопоточным, синхронный интерфейс с конвейером позволяет использовать одиночное соединение при обработке N потоков клиентского приложения.(Так что здесь, это стратегия реализации, помогающая создать поточно-ориентированное соединение.)
Если интерфейс с конвейером является асинхронным, то даже однопоточное клиентское приложение может выиграть.Пропускная способность увеличивается по крайней мере на порядок.
(Предостережения с конвейерной обработкой: написать отказоустойчивый конвейерный клиент нетривиально.)
В идеале я должен использовать диаграмму, нообратите внимание на то, что происходит в конце клипа: http://www.youtube.com/watch?v=NeK5ZjtpO-M