如何在node.js中pipe道到redis?

我有很多的数据插入(SET \ INCR)到redis DB,所以我正在寻找pipeline \ mass插入通过node.js。

我在node.js中找不到任何好的示例/ API,所以任何帮助都会很棒!

是的,我必须同意,缺乏这方面的例子,但我设法创build了我批量发送几个插入命令的stream。

您应该为redisstream安装模块:

npm install redis-stream 

这就是你如何使用stream:

 var redis = require('redis-stream'), client = new redis(6379, '127.0.0.1'); // Open stream var stream = client.stream(); // Example of setting 10000 records for(var record = 0; record < 10000; record++) { // Command is an array of arguments: var command = ['set', 'key' + record, 'value']; // Send command to stream, but parse it before stream.redis.write( redis.parse(command) ); } // Create event when stream is closed stream.on('close', function () { console.log('Completed!'); // Here you can create stream for reading results or similar }); // Close the stream after batch insert stream.end(); 

此外,您可以创build任意数量的stream ,并随时打开/closures它们。

在redis-stream节点模块的 node.js中有几个使用redisstream的 例子

在node_redis中,所有命令都是stream水线的:

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

你也可能想看batch()multi()会慢些的原因是因为它是事务性的。 如果失败了,什么都不会执行。 这可能是你想要的,但是你在这里有select的速度。

redis-stream包似乎没有利用Redis的批量插入function,所以它比Redis的站点用redis-cli讨论的块插入慢。

另一个想法是使用redis-cli,并给它一个文件stream,从这个NPM包: https : //github.com/almeida/redis-mass

不急于先写入磁盘上的文件? 这个回购: https : //github.com/eugeneiiim/node-redis-pipe/blob/master/example.js

…也stream向Redis,但不写入文件。 它stream入一个产生的过程,并经常冲洗缓冲区。

在Redis的网站下插入( http://redis.io/topics/mass-insert ),你可以看到一个小小的Ruby例子。 上面的回购基本上把它移植到Node.js上,然后直接将其stream式传输到产生的redis-cli进程。

所以在Node.js中,我们有:

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

spawn()返回一个你可以通过stdin传递给subprocess的引用。 例如: redisPipe.stdin.write()

你可以继续写一个缓冲区,把它们传递给subprocess,然后每隔一段时间清理一次。 这样就不会填满它,因此在内存方面比node_redis包(在文档中的字面意思是数据保存在内存中)要好一些,尽pipe我没有深入研究它,不知道内存占用是多less。 这可能是做同样的事情。

当然要记住,如果出了什么问题,一切都会失败。 这就是像fluentd这样的工具创build的(这是另一个select: http ://www.fluentd.org/plugins/all – 它有几个Redis插件)…但是,这意味着你正在支持磁盘上的数据在某种程度上某处。 我个人也使用Embulk也这样做(这需要在磁盘上的文件),但它不支持大量插入,所以它很慢。 花费了近2小时的30,000条logging。

stream式方法(不受磁盘支持)的一个好处是如果您正在从另一个数据源进行大量插入。 假设数据源返回大量数据,而您的服务器没有硬盘空间来支持所有的数据 – 您可以改为使用stream式处理。 再次,你冒失败的风险。

我发现自己处于这个位置,因为我正在构buildDocker映像,该映像将在服务器上运行,但没有足够的磁盘空间来容纳大型数据集。 当然,如果你可以把所有的东西放在服务器的硬盘上,它会容易redis-cli 。但是如果你不能,stream式传输到redis-cli可能是你唯一的select。

如果你确实定期推送大量数据,我可能会推荐fluentd说实话。 它具有许多强大的function,可以确保您的数据能够传输到正确的位置,如果失败了,可以继续执行。

所有这些Node.js方法的一个问题是,如果失败了,你要么全部丢失,要么全部重新插入。