Tecnología de pipelining de Redis
Redis es un servicio TCP basado en el modelo cliente-servidor y el protocolo de solicitud/respuesta. Esto significa que, normalmente, una solicitud sigue los siguientes pasos:
- El cliente envía una solicitud de consulta al servidor y escucha la respuesta del socket, normalmente en modo bloqueante, esperando la respuesta del servidor.
- El servidor procesa el comando y devuelve el resultado al cliente.
Tecnología de pipelining de Redis
La tecnología de pipelining de Redis permite que el cliente continúe enviando solicitudes al servidor sin esperar la respuesta de este, y finalmente lea todas las respuestas del servidor de una sola vez.
Ejemplo
Para ver el pipelining de Redis, solo necesita iniciar una instancia de Redis e ingresar el siguiente comando:
$(echo -en "PING\r\n SET ejemplokey redis\r\nGET ejemplokey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379 +PONG +OK redis :1 :2 :3
En el ejemplo anterior, mediante el uso dePINGcomando para comprobar si el servicio de Redis está disponible. Después, establecimos el valor de ejemplokey como 'redis', luego obtuvimos el valor de ejemplokey e incrementamos 'visitor' 3 veces.
En los resultados devueltos, podemos ver que estos comandos se envían al servicio de Redis de una sola vez, y finalmente se leen todas las respuestas del servidor de una vez.
Ventajas de la tecnología de pipelining
La ventaja más significativa de la tecnología de pipelining es que mejora el rendimiento del servicio de Redis.
Algunos datos de prueba
En la siguiente prueba, usaremos el cliente Ruby de Redis, que admite la función de pipelining, para probar el efecto de mejora de velocidad del pipelining.
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
}
Los datos obtenidos al ejecutar este sencillo script desde un sistema Mac OS X en la red de área local muestran que, después de habilitar la operación de pipelining, la latencia de ida y vuelta se ha reducido considerablemente.
without pipelining 1.185238 seconds with pipelining 0.250783 seconds
Como puedes ver, después de habilitar el pipelining, nuestra velocidad y eficiencia aumentaron 5 veces.
Otras extensiones