对于我的任务,我需要尽快将大量数据加载到Redis中。看来这篇文章对我的案例是正确的:https://redis.io/topics/mass-insert
本文首先介绍如何使用 redis-cli 使用多个内联SET
命令。然后他们继续生成Redis协议,并再次使用 redis-cli 。他们没有解释使用Redis协议的原因或好处。
使用Redis协议有点困难,它会产生更多的流量。我想知道,使用Redis协议而不是简单的单行命令的原因是什么?可能尽管数据更大,但Redis解析它更容易(也更快)?
答案 0 :(得分:1)
好点。
只有一小部分客户支持非阻塞I / O ,而不是 所有客户都能够以有效的方式解析回复 为了最大化吞吐量。出于所有这些原因,首选方式 将数据大量导入Redis是为了生成一个包含的文本文件 Redis协议,原始格式,以调用命令 需要插入所需的数据。
我理解的是,当您直接使用Redis协议时,您可以模拟客户端,这将受益于突出显示的点。
根据您提供的文档,我尝试了以下脚本:
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
(0...100000).each{|n|
STDOUT.write(gen_redis_proto("SET","Key#{n}","Value#{n}"))
}
(0...100000).each{|n|
STDOUT.write("SET Key#{n} Value#{n}\r\n")
}
ruby test.rb > 100k_prot.txt
ruby test_no_protocol.rb > 100k_no_prot.txt
time cat 100k.txt | redis-cli --pipe
time cat 100k_no_prot.txt | redis-cli --pipe
我得到了这些结果:
teixeira: ~/stackoverflow $ time cat 100k.txt | redis-cli --pipe
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 100000
real 0m0.168s
user 0m0.025s
sys 0m0.015s
(5 arquivo(s), 6,6Mb)
teixeira: ~/stackoverflow $ time cat 100k_no_prot.txt | redis-cli --pipe
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 100000
real 0m0.433s
user 0m0.026s
sys 0m0.012s