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