2011-10-28 8 views
5

En los Redis protocol documentation afirma:¿Cómo implementan los clientes de Redis la canalización?

Un cliente puede utilizar la misma conexión con el fin de emitir varios comandos . Se admite la canalización por lo que se pueden enviar múltiples comandos con una sola operación de escritura por parte del cliente, no es necesario leer la respuesta del servidor para emitir el siguiente comando. Todas las respuestas se pueden leer al final.

Sin embargo, no encuentro ningún ejemplo de cómo esto se implementa realmente. ¿Cómo implementa un cliente Redis la canalización?

Respuesta

4

Siempre que pueda delimitar fácilmente los mensajes en una secuencia TCP, se necesita poco soporte para que un servidor admita pipelining, la pila TCP almacenará los datos en búfer, y como servidor puede leer/analizar solicitudes uno por uno, y envíe respuestas cuando termine las solicitudes. El cliente/servidor solo debe tener en cuenta y manejar los casos cuando estos búferes se llenan, para no estancarse.

Dicho esto, para redis eche un vistazo a processInputBuffer()/processMultibulkBuffer() en networking.c, redis también tiene su propio buffer de salida, vea p. addReply()

4

Un par buenas, ejemplos sencillos de cómo se implementa esto se puede encontrar en la fuente para el cliente Redis Ruby, redis-rb, y uno de Python, redis-py, respectivamente aparece a continuación.

Lo hacen esencialmente lo TaylorOtwell se mencionó anteriormente, concatenar del lado del cliente las solicitudes que se harán a Redis en una tubería en una única solicitud de red, mientras que las transacciones podrían utilizar los comandos Redis MULTI/EXEC para comenzar y finalizar una transacción.

redis-RB (de redis.rb y pipeline.rb):

def pipelined(options = {}) 
    synchronize do 
    begin 
     original, @client = @client, Pipeline.new 
     yield 
     if @client.commands.empty? 
     [] 
     else 
     original.call_pipelined(@client.commands, options) 
     end 
    ensure 
     @client = original 
    end 
    end 
end 

def call_pipelined(commands, options = {}) 
    @commands.concat commands 
    nil 
end 

Otro buen ejemplo se puede encontrar en la fuente para redis-py, un cliente redis Python. Espero que ayude.

2

Solo agregue más información a las respuestas anteriores. Una forma de entender el proceso de redis es entender el hecho de que Redis Pipeline es completamente una implementación del lado del cliente y el servidor Redis no tiene nada que ver con eso. Si bien esto difiere entre las diferentes implementaciones de clientes, aquí está la idea generalizada:

Pipelining está dirigido a resolver problemas de latencia de respuesta en entornos de alta latencia de red. Por lo tanto, cuanto menor sea la cantidad de tiempo que pasa en la red al enviar comandos y leer la respuesta, mejor. Esto se logra de manera efectiva mediante el almacenamiento en búfer. El cliente puede (o no) almacenar en búfer los comandos en la pila TCP (como se menciona en otras respuestas) antes de enviarlos al servidor. Una vez que se envían al servidor, el servidor los ejecuta y los almacena en el servidor. A diferencia del caso habitual en el que el cliente lee la respuesta tan pronto como se recibe la respuesta, en el caso del pipeline, el cliente lee las respuestas del buffer del lado del servidor en partes o cuando la aplicación ejecuta 'sync' (cierra la canalización). Esto es ventajoso porque el tiempo que el cliente pasa leyendo la red a través de la red es mucho menor.

Aquí hay un post en mi blog que puede consultar para obtener una mejor idea: http://nachivpn.blogspot.in/2014/11/redis-pipeline-explained.html

Cuestiones relacionadas