Конвейеризация Redis
Redis — это TCP-сервис, основанный на модели клиент-сервер и протоколе запрос/ответ. Это означает, что обычно запрос проходит следующие этапы:
- Клиент отправляет запрос на сервер и прослушивает возврат Socket, обычно в блокирующем режиме, ожидая ответа сервера.
- Сервер обрабатывает команду и возвращает результат клиенту.
Конвейеризация Redis
Конвейеризация Redis позволяет клиенту продолжать отправлять запросы на сервер, пока сервер ещё не ответил, и в конце прочитать все ответы сервера сразу.
Пример
Чтобы просмотреть конвейер Redis, просто запустите экземпляр Redis и введите следующую команду:
$(echo -en "PING\r\n SET examplekey redis\r\nGET examplekey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379 +PONG +OK redis :1 :2 :3
В приведённом выше примере мы использовали командуPING, чтобы проверить, доступна ли служба Redis. После этого мы установили значение examplekey в redis, затем получили значение examplekey и увеличили visitor 3 раза.
Из возвращённых результатов видно, что эти команды отправляются в службу Redis сразу, и в конце все ответы сервера читаются сразу.
Преимущества конвейеризации
Самое значительное преимущество конвейеризации заключается в том, что она повышает производительность сервиса Redis.
Некоторые тестовые данные
В следующем тесте мы будем использовать Ruby-клиент Redis, который поддерживает функции конвейеризации, чтобы проверить эффект ускорения от конвейеризации.
require 'rubygems'
require 'redis'
def bench(descr)
start = Time.now
yield
puts "#{descr} #{Time.now-start} seconds"
end
def without_pipelining
r = Redis.new
10000.times {
r.ping
}
end
def with_pipelining
r = Redis.new
r.pipelined {
10000.times {
r.ping
}
}
end
bench("without pipelining") {
without_pipelining
}
bench("with pipelining") {
with_pipelining
}
Данные выполнения приведённого выше простого скрипта в системе Mac OS X в локальной сети показывают, что после включения конвейеризации задержка кругового обхода снизилась до довольно низкого уровня.
without pipelining 1.185238 seconds with pipelining 0.250783 seconds
Как видите, после включения конвейеризации наша эффективность по скорости повысилась в 5 раз.
Другие расширения