Node-redis: Pipeline

CrĂ©Ă© le 13 janv. 2014  Â·  9Commentaires  Â·  Source: NodeRedis/node-redis

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

Feature Request fixed / done

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 :

  1. Le rappel pour le sismember est ce qui invoque l'appel hgetall -- par consĂ©quent, vous empĂȘchez implicitement que ces commandes soient mises en pipeline ensemble pour tout appel sismember donnĂ©. Le rappel n'est pas invoquĂ© tant que Redis n'a pas rĂ©pondu.
  2. Si 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

Tous les 9 commentaires

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,

  1. Je suis confus, Ă  quoi servent les fonctions "multi" dans node_redis alors?
  2. Quel est l'algorithme utilisé pour pipeliner automatiquement les commandes ?

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 :

  1. Le rappel pour le sismember est ce qui invoque l'appel hgetall -- par consĂ©quent, vous empĂȘchez implicitement que ces commandes soient mises en pipeline ensemble pour tout appel sismember donnĂ©. Le rappel n'est pas invoquĂ© tant que Redis n'a pas rĂ©pondu.
  2. Si 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.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

michaelwittig picture michaelwittig  Â·  3Commentaires

Atala picture Atala  Â·  3Commentaires

ghost picture ghost  Â·  3Commentaires

Mickael-van-der-Beek picture Mickael-van-der-Beek  Â·  6Commentaires

adamgajzlerowicz picture adamgajzlerowicz  Â·  4Commentaires