13

redis DB に挿入するデータ (SET \ INCR) がたくさんあるので、 node.jsを介してパイプライン\一括挿入を探しています。

node.jsでこれを行うための良い例/ APIが見つからなかったので、どんな助けも素晴らしいでしょう!

4

4 に答える 4

6

node_redis では、すべてのコマンドがパイプライン化されています。

https://github.com/mranney/node_redis/issues/539#issuecomment-32203325

于 2014-02-10T15:26:17.610 に答える
2

あなたbatch()も見てみたいかも。で遅くなる理由multi()は、トランザクションであるためです。何かが失敗した場合、何も実行されません。それはあなたが望むものかもしれませんが、ここで速度を選択できます.

redis-stream パッケージは Redis の一括挿入機能を利用していないように見えるため、Redis のサイトでredis-cli.

もう 1 つのアイデアは、redis-cli を使用して、ストリーミング元のファイルを提供することです。この NPM パッケージは、https ://github.com/almeida/redis-mass を実行します。

最初にディスク上のファイルに書き込みたくないですか? このリポジトリ: https://github.com/eugeneiiim/node-redis-pipe/blob/master/example.js

...Redis にもストリーミングしますが、ファイルへの書き込みは行いません。生成されたプロセスにストリーミングし、バッファを頻繁にフラッシュします。

Mass Insert の下の Redis のサイト ( http://redis.io/topics/mass-insert ) で、ちょっとした Ruby の例を見ることができます。上記のリポジトリは基本的にそれを Node.js に移植し、生成されたredis-cliプロセスに直接ストリーミングしました。

したがって、Node.js には次のものがあります。

var redisPipe = spawn('redis-cli', ['--pipe']);

spawn()でパイプできる子プロセスへの参照を返しますstdin。例: redisPipe.stdin.write().

バッファへの書き込みを続け、それを子プロセスにストリーミングしてから、頻繁にクリアすることができます。これはそれをいっぱいにすることはないので、おそらくnode_redisパッケージよりもメモリ上で少し良くなります(データはメモリに保持されていると文字通りドキュメントに書かれています)。メモリフットプリントが最終的にどうなるかを知ってください。同じことをしている可能性があります。

もちろん、何かがうまくいかない場合はすべて失敗することを覚えておいてください。それが fluentd のようなツールが作成された目的です (それはさらに別のオプションです: http://www.fluentd.org/plugins/all - いくつかの Redis プラグインがあります)...しかし、繰り返しますが、これはディスク上のデータをバックアップしていることを意味しますある程度どこか。私もこれを行うために Embulk を個人的に使用しましたが (これにはディスク上のファイルが必要でした)、一括挿入をサポートしていないため、処理が遅くなりました。30,000 レコードに 2 時間近くかかりました。

ストリーミング アプローチ (ディスクを使用しない) の利点の 1 つは、別のデータ ソースから大量の挿入を行う場合です。データ ソースが大量のデータを返し、サーバーにそのすべてをサポートするためのハード ディスク領域がない場合、代わりにストリーミングすることができます。繰り返しますが、失敗のリスクがあります。

大規模なデータ セットを収容するのに十分なディスク領域がないサーバー上で実行される Docker イメージを構築しているため、私はこの立場にいます。もちろん、サーバーのハードディスクにすべてを収めることができれば、はるかに簡単ですが...しかし、それができない場合は、ストリーミングがredis-cli唯一の選択肢かもしれません。

本当に大量のデータを定期的にプッシュしている場合は、正直に言うと、fluentd をお勧めします。データが目的の場所に確実に到達し、何かが失敗した場合に再開できるようにするための多くの優れた機能が付属しています。

これらすべての Node.js アプローチの問題の 1 つは、何かが失敗した場合、すべてを失うか、最初からやり直さなければならないことです。

于 2016-05-05T23:43:45.350 に答える