一、介绍
有时候,Redis实例需要在很短的时间内加载大量先前存在或用户生成的数据,以便尽可能快地创建数百万个键。这就是所谓的批量插入,本文档的目标是提供有关如何以尽可能快的速度向Redis提供数据的信息。如果想查看英文原文,地址如下:二、操作详解话不多说,直接进入主题了。
1、使用协议,卢克(Use the protocol, Luke) 使用普通Redis客户端的方式执行批量插入的操作并不是一个很好的办法,原因如下:发送一个命令的方式很慢,因为您必须为每个命令都会有往返的时间消耗。虽然可以使用管道模式来操作,但为了批量插入多条记录,您需要在读取回复的同时编写新命令,以确保尽可能快地插入。 另外,只有一小部分客户端支持非阻塞 I/O 操作,而且并不是所有的客户端都能够以最大化吞吐量这种有效的方式来解析这些回复。 由于以上这些原因,将大量数据导入Redis的首选方式是生成包含Redis协议的文本文件(原始格式),以便调用插入所需数据所需的命令。 例如,如果我需要生成一个大型数据集,其中包含数十亿个键:“keyN - > ValueN”,我将创建一个包含如下Redis协议格式的命令的文件:SET Key0 Value0 SET Key1 Value1 ... SET KeyN ValueN
(cat data.txt; sleep 10) | nc localhost 6379 > /dev/null
cat data.txt | redis-cli --pipe
All data transferred. Waiting for the last reply... Last reply received from server. errors: 0, replies: 1000000
*$ ...
*3$3 SET $3 key $5 value
"*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n"
def gen_redis_proto(*cmd) proto = "" proto << "*"+cmd.length.to_s+"\r\n" cmd.each{ |arg| proto << "$"+arg.to_s.bytesize.to_s+"\r\n" proto << arg.to_s+"\r\n" } proto end puts gen_redis_proto("SET","mykey","Hello World!").inspect
(0...1000).each{|n| STDOUT.write(gen_redis_proto("SET","Key#{n}","Value#{n}")) }
$ ruby proto.rb | redis-cli -h 192.168.127.130 -p 6379 --pipe All data transferred. Waiting for the last reply... Last reply received from server. errors: 0, replies: 1000
SET Key0 Value0 SET Key1 Value1 SET Key2 Value2 SET Key3 Value3 SET Key4 Value4 SET Key5 Value5 SET Key6 Value6 SET Key7 Value7 SET Key8 Value8 SET Key9 Value9 SET Key10 Value10 ... SET KeyN ValueN
[root@linux ~]# unix2dos redis_commands.txt unix2dos:converting file redis_commands.txt to DOS format ...
[root@linux ~]# yum install unix2dos
[root@linux ~]# cat redis_commands.txt | redis-cli -h 192.168.127.130 -p 6379 [-a "password"] -n 0 --pipe All data transferred.Waiting for the last reply... Last reply received from server. errors:0,replies:10000000