或者表⽰为引⽤的字符串:
\"*3\\r\\n$3\\r\\nSET\\r\\n$3\\r\\nkey\\r\\n$5\\r\\nvalue\\r\\n\"
为批量插⼊⽽⽣成的⽂件只不过是由以上述⽅式表⽰的⼀个接⼀个的命令组成的。 以下Ruby函数⽣成有效的协议:
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}\")) }
我们可以在redis-cli的管道中直接运⾏程序,以执⾏我们的第⼀次海量导⼊会话。
$ 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
3、管道模式如何在引擎下⼯作(How the pipe mode works under the hoods)
redis-cli管道模式的速度和netcat⼀样快,与此同时,仍然能够明⽩服务器最后⼀次发送回复的时间。 这是通过以下⽅式获得的:
3.1、redis-cli --pipe Redis客户端会尽可能快的向服务器发送数据。 3.2、同时,会尽可能快的读取并解析数据⽂件中的内容。
3.3、⼀旦从标准输⼊设备读取数据完毕,它将会发送⼀个带有20个字节的字符串的特殊的ECHO命令到服务器:我们确信这是最新发送的命令,如果我们收到作为批量回复的相同的20个字节的消息,我们确信可以做“答复匹配检查”。
3.4、这个特殊的最终命令⼀经发送,Redis服务器端将接收到回复和这20个字节的回复消息做匹配。如果匹配,它可以成功退出,表⽰插⼊完毕。
使⽤这个技巧,我们不需要解析我们发送给服务器的协议,以了解我们发送了多少条命令,仅仅是⼀个答复⽽已。
但是,在解析回复时,我们会对所有解析的回复进⾏计数,以便在最后我们能够告诉⽤户传输到服务器的命令的数量在这次批量插⼊的会话中。
4、⽰例代码操作
4.1、准备数据⽂件,格式是⽂本⽂件,名称是:redis_commands.txt。
我在Windows环境下⽣成了⼀个txt⽂件,⼀条数据⼀⾏,代码如下:
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
我⽣成了500万的数据,因为这个⽂本⽂件我是在Windows环境下⽣成的,所以需要格式转换。
4.2、如果使⽤Windows环境下⽣成的⽂件,需要进⾏格式转换,如果是在Linux环境下⽣成的⽂件就不需要格式转换,如果⽂本⽂件⽐较⼤,执⾏转换时间会有⼏秒,等待即可。
执⾏格式转换
[root@linux ~]# unix2dos redis_commands.txt
unix2dos:converting file redis_commands.txt to DOS format ...
以上代码进⾏格式转换完毕
需要说明⼀点,unix2dos这个命令需要先安装,如果没有安装,会提⽰:command not found。 执⾏以下命令安装:
[root@linux ~]# yum install unix2dos
4.3、进⾏数据批量插⼊
[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
批量插⼊数据成功,⼀千万的数据⼤概要花费50⼏秒左右。
三、总结
好的,今天就写到这⾥,⼤批量数据插⼊的就是这么容易。只要理解了,其实也不是很难,技术就是⼀层窗户纸,⼀捅就破,但是没⼈捅就⽐较⿇烦。下⼀篇⽂章,我们将写⼀些关于redis协议格式的⽂章,如果要涉及⼤批量数据插⼊,就会涉及到redis规范协议的问题。