Redis大量插入:协议与内联命令

时间:2017-08-01 15:29:04

标签: redis protocols bulk bulk-load

对于我的任务,我需要尽快将大量数据加载到Redis中。看来这篇文章对我的案例是正确的:https://redis.io/topics/mass-insert

本文首先介绍如何使用 redis-cli 使用多个内联SET命令。然后他们继续生成Redis协议,并再次使用 redis-cli 。他们没有解释使用Redis协议的原因或好处。

使用Redis协议有点困难,它会产生更多的流量。我想知道,使用Redis协议而不是简单的单行命令的原因是什么?可能尽管数据更大,但Redis解析它更容易(也更快)?

1 个答案:

答案 0 :(得分:1)

好点。

  

只有一小部分客户支持非阻塞I / O ,而不是   所有客户都能够以有效的方式解析回复   为了最大化吞吐量。出于所有这些原因,首选方式   将数据大量导入Redis是为了生成一个包含的文本文件   Redis协议,原始格式,以调用命令   需要插入所需的数据。

我理解的是,当您直接使用Redis协议时,您可以模拟客户端,这将受益于突出显示的点。

根据您提供的文档,我尝试了以下脚本:

test.rb

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}"))
}

test_no_protocol.rb

(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