Comment faire pour canalisation en node.js à redis?
J'ai beaucoup de données à insérer (MIS \ INCR) à redis DB, donc je suis à la recherche d' pipeline \ masse d'insertion par node.js.
Je ne pouvais pas trouver tout bon exemple/API pour le faire dans node.js, de sorte que toute aide serait super!
Vous devez vous connecter pour publier un commentaire.
Oui, je suis d'accord qu'il y a manque d'exemples, mais j'ai réussi à créer le flux sur lequel j'ai envoyé plusieurs commandes insérer dans le lot.
Vous devez installer le module pour le redis stream:
Et ce est la façon dont vous utilisez du flux:
Aussi, vous pouvez créer autant de de nombreux cours d'eau que vous le souhaitez et de les ouvrir/fermer comme vous le souhaitez à tout moment.
Il y a plusieurs exemples de l'aide redis flux dans node.js sur redis flux-nœud de module
eval
ouevalsha
les commandes envoyées par pipeline.stream.write( ... )
Dans la nouvelle version c'est:stream.redis.write( ... )
Dans node_redis il y a toutes les commandes sont en pipeline:
https://github.com/mranney/node_redis/issues/539#issuecomment-32203325
Vous voudrez peut-être regarder à
batch()
trop. La raison pour laquelle il serait plus lent avecmulti()
est parce que c'est transactionnel. Si quelque chose a échoué, rien ne serait exécuté. Qui peut être ce que vous voulez, mais vous avez le choix pour la vitesse ici.Le redis-flux de paquet ne semble pas faire l'utilisation de Redis " de masse insérer une fonctionnalité de sorte qu'il est aussi plus lent que la masse insérer le Redis site va parler avec
redis-cli
.Une autre idée serait d'utiliser redis-cli et de lui donner un fichier pour diffuser de, ce qui ce package NPM n': https://github.com/almeida/redis-mass
Ne tient pas à l'écrire dans un fichier sur le disque en premier? Ce repo: https://github.com/eugeneiiim/node-redis-pipe/blob/master/example.js
...également des ruisseaux Redis, mais sans l'écriture dans le fichier. Elle diffuse à un processus générés dynamiquement et vide le tampon de chaque tellement souvent.
Sur le Redis' site en vertu de la masse insert (http://redis.io/topics/mass-insert) vous pouvez voir un peu de Ruby exemple. Les pensions de titres ci-dessus essentiellement porté que pour Node.js et puis diffusée directement à
redis-cli
processus qui a vu le jour.Donc dans Node.js nous avons:
var redisPipe = spawn('redis-cli', ['--pipe']);
spawn()
renvoie une référence à un processus enfant que vous pouvez pipe avecstdin
. Par exemple:redisPipe.stdin.write()
.Vous pouvez continuer à écrire à un tampon, streaming que pour le processus de l'enfant, puis de l'effacer chaque tellement souvent. Ensuite, cela ne sera pas le remplir et va donc être un peu mieux sur la mémoire est peut-être la
node_redis
paquet (qui dit littéralement dans ses docs que les données sont conservées dans la mémoire) mais je n'ai pas regardé ce que profondément je ne sais donc pas ce que l'empreinte mémoire finit par être. Il pourrait faire la même chose.Bien sûr garder à l'esprit que si quelque chose va mal, tout cela échoue. C'est ce que des outils comme fluentd ont été créés pour (et c'est encore une autre option: http://www.fluentd.org/plugins/all - il a plusieurs Redis plugins)...Mais encore une fois, cela signifie que vous êtes la sauvegarde de données sur disque quelque part à un certain degré. J'ai personnellement utilisé Embulk pour ce faire trop (qui a exigé un fichier sur le disque), mais il n'a pas la masse de soutien inserts, de sorte qu'il était lent. Il a fallu près de 2 heures pour 30 000 enregistrements.
Un avantage pour un streaming approche (qui n'est pas soutenue par disque) si vous êtes en train de faire une énorme insérer à partir d'une autre source de données. En supposant que la source de données renvoie un grand nombre de données et que votre serveur ne dispose pas de l'espace sur le disque dur à l'appui de tout cela - vous pouvez diffuser de la place. Encore une fois, tu risques d'échecs.
Je me trouve dans cette position que je suis en train de construire un menu fixe de l'image qui va s'exécuter sur un serveur avec pas assez d'espace disque pour accueillir de grands ensembles de données. Bien sûr, il est beaucoup plus facile si vous pouvez tout sur le disque dur du serveur...Mais si vous ne pouvez pas, en streaming
redis-cli
peut être votre seule option.Si vous êtes vraiment en poussant un grand nombre de données dans sur une base régulière, je vous recommanderais sûrement fluentd pour être honnête. Il est livré avec de nombreuses fonctionnalités pour vous assurer que vos données rend à l'endroit où il va et si quelque chose échoue, il peut le reprendre.
Un problème avec l'ensemble de ces Node.js approches est que si quelque chose échoue, soit vous perdez tout ou insérez une fois de plus.