Salut les gars,
comment activer le pipeline dans node_redis par programmation ?
J'ai vu la documentation dire que cela se produit automatiquement dans la plupart des cas - et je comprends qu'il existe un moyen de le forcer Ă partir du code de l'application par programme dans node_redis
[ ec2-user@devops ~]$ redis-benchmark -n 100000 -t set,get -P 16 -q -h 10.0.1.10
SETÂ : 199600,80Â requĂȘtes par seconde
GETÂ : 193050,19Â requĂȘtes par seconde
[ ec2-user@devops ~]$ redis-benchmark -n 100000 -t set,get -q -h 10.0.1.12
SETÂ : 14098,41 requĂȘtes par seconde
OBTENIRÂ : 13743,82Â requĂȘtes par seconde
c'est plus de 10 fois la diffĂ©rence sur le nĆud Redis.
Merci,
Dmitry
Est-ce fait via les commandes client.multi & multi.exec ?
Salut @saritasa -- le pipeline est automatique. Cela se passe toujours à l'intérieur du client. Vous n'avez pas besoin d'utiliser multi ou exec pour l'activer.
Salut Bryce,
Merci,
Dmitry
Les opérations multiples proviennent de la spécification du protocole Redis, elles ont un objectif transactionnel en dehors du pipeline : http://redis.io/commands/multi
En termes de fonctionnement du pipeline : http://redis.io/topics/pipelining, il s'agit simplement que le client écrive des commandes à Redis aussi rapidement que vous les envoyez sans attendre la réponse avant d'écrire la suivante. Le client garde une trace des commandes envoyées, puis réaligne les réponses avec les commandes envoyées une fois que Redis a répondu.
Merci Bryce, je comprends comment fonctionne http://redis.io/topics/pipelining . dans une application node.js - comment le code doit-il ĂȘtre structurĂ© pour que les requĂȘtes soient acheminĂ©es ?
donc dans l'exemple ci-dessous
hgetall & expire - sont en pipeline ou non ? L'un des appels est à l'intérieur du rappel.
fonction getByID(table, id, suivant) {
if (!success) return setTimeout(function () {
getByID(table, id, suivant);
}, 2000);
var end = utils.getEndTime(),
base = getBase(),
client = getClient(PK2str(table, id)),
key = getHashID(table, id);
base.sismember(table, key, function (err, val) {
if (err || !val) return next();
client.hgetall(key, function (err, val) {
if (err || !val) return next(new Error('Expired'), id);
val = arrays_parse(table, val);
next(null, val);
client.expire(key, cfg.ttl.shards);
if (!exports.silent) {
profiler.log('cache', {
'table': table,
'id': key,
'method': 'getByID',
'data': val,
'time': end()
});
}
});
});
}
Toutes les commandes sont envoyĂ©es « en pipeline », mais elles ne seraient jamais envoyĂ©es dans le mĂȘme cadre d'Ă©criture en pipeline pour une ou deux raisons :
base
et client
sont des clients Redis diffĂ©rents, ils pourraient _JAMAIS_ partager le mĂȘme pipeline.Les commandes doivent ĂȘtre exĂ©cutĂ©es Ă partir du mĂȘme contexte* pour voir tout avantage du pipeline. Par exemple, similaire Ă l'exemple PING dans les documents de pipeline de redis :
// These commands will all be pipelined together:
client.ping()
client.ping()
client.ping()
client.ping(function () {
// This would *NEVER* be in the same pipeline frame as the other four because it requires a reply to be received first
client.ping()
})
* ou à partir de contextes distincts s'il est envoyé plus rapidement que Redis ne répond, mais ne répond jamais à des contextes dépendants
je l'ai maintenant - merci! C'est un commentaire trÚs précieux !
Je pense que le "pipelining automatique" de node_redis n'est pas le pipeline référencé par redis officiel.
Ce temps est appelĂ© RTT (Round Trip Time). Il est trĂšs facile de voir comment cela peut affecter les performances lorsqu'un client doit effectuer de nombreuses requĂȘtes Ă la suite (par exemple, ajouter de nombreux Ă©lĂ©ments Ă la mĂȘme liste, ou remplir une base de donnĂ©es avec de nombreuses clĂ©s). Par exemple, si le temps RTT est de 250 millisecondes (dans le cas d'un lien trĂšs lent sur Internet), mĂȘme si le serveur est capable de traiter 100 000 requĂȘtes par seconde, nous pourrons traiter au maximum quatre requĂȘtes par seconde.
Si l'interface utilisĂ©e est une interface de bouclage, le RTT est beaucoup plus court (par exemple mon hĂŽte rapporte 0,044 millisecondes ping 127.0.0.1), mais c'est quand mĂȘme beaucoup si vous devez effectuer de nombreuses Ă©critures Ă la suite.
Ce que signifie le pipeline par redis officiel, c'est combiner plusieurs commandes et les envoyer une fois pour contrer la latence due Ă RTT, qui n'est pas adressĂ©e par node_redis. Et le "pipelining automatique" dans node_redis envoie en fait autant de commandes que possible en mĂȘme temps en utilisant le modĂšle de programmation asynchrone de Node.
Voici un bon article traitant de cette question. http://informatikr.com/2012/redis-pipelining.html
@Vizwind @saritasa .multi et .batch utilisent le pipeline comme prévu à partir de la version 2.2.
Commentaire le plus utile
Toutes les commandes sont envoyĂ©es « en pipeline », mais elles ne seraient jamais envoyĂ©es dans le mĂȘme cadre d'Ă©criture en pipeline pour une ou deux raisons :
base
etclient
sont des clients Redis diffĂ©rents, ils pourraient _JAMAIS_ partager le mĂȘme pipeline.Les commandes doivent ĂȘtre exĂ©cutĂ©es Ă partir du mĂȘme contexte* pour voir tout avantage du pipeline. Par exemple, similaire Ă l'exemple PING dans les documents de pipeline de redis :
* ou à partir de contextes distincts s'il est envoyé plus rapidement que Redis ne répond, mais ne répond jamais à des contextes dépendants