Pipelining Redis
Redis est un service TCP basé sur le modèle client-serveur et le protocole requête/réponse. Cela signifie que normalement une requête suit ces étapes :
- Le client envoie une requête au serveur et écoute le retour du Socket, généralement en mode bloquant, en attendant la réponse du serveur.
- Le serveur traite la commande et renvoie le résultat au client.
Pipelining Redis
Le pipelining Redis permet au client de continuer à envoyer des requêtes au serveur alors que le serveur n'a pas encore répondu, et enfin de lire toutes les réponses du serveur en une seule fois.
Exemple
Pour visualiser le pipeline Redis, il suffit de démarrer l'instance Redis et de saisir la commande suivante :
$(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
Dans l'exemple ci-dessus, nous avons utilisé la commandePINGpour vérifier si le service Redis est disponible. Ensuite, nous avons défini la valeur de examplekey sur redis, puis nous avons récupéré la valeur de examplekey et incrémenté visitor 3 fois.
D'après les résultats renvoyés, nous pouvons voir que ces commandes sont envoyées au service Redis en une seule fois, et finalement toutes les réponses du serveur sont lues en une seule fois.
Avantages du pipeline
L'avantage le plus significatif du pipelining est qu'il améliore les performances du service Redis.
Quelques données de test
Dans le test suivant, nous allons utiliser le client Ruby de Redis, qui prend en charge les fonctionnalités de pipelining, pour tester l'effet d'amélioration de la vitesse du 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
}
Les données issues de l'exécution du script simple ci-dessus sur un système Mac OS X sur le réseau local montrent qu'après activation du pipelining, le délai aller-retour a été réduit à un niveau assez faible.
without pipelining 1.185238 seconds with pipelining 0.250783 seconds
Comme vous pouvez le voir, après activation du pipelining, notre efficacité de vitesse a été améliorée de 5 fois.
Autres extensions