Redis массовая вставка: протокол против встроенных команд
Для моей задачи мне нужно как можно скорее загрузить большую часть данных в Redis. Похоже, эта статья относится к моему делу правильно: https://redis.io/topics/mass-insert
Статья начинается с примера использования нескольких встроенных SET
Команды с Redis-Cli. Затем они приступают к генерации протокола Redis и снова используют его с Redis-Cli. Они не объясняют причины или преимущества использования протокола Redis.
Использование протокола Redis немного сложнее и генерирует немного больше трафика. Интересно, каковы причины использования протокола Redis, а не простых однострочных команд? Вероятно, несмотря на то, что данные больше, Redis легче (и быстрее) их анализирует?
1 ответ
Хорошая точка зрения.
Только небольшой процент клиентов поддерживает неблокирующие операции ввода-вывода, и не все клиенты могут эффективно анализировать ответы, чтобы максимизировать пропускную способность. По всем этим причинам предпочтительным способом массового импорта данных в 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: ~/stackru $ 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: ~/stackru $ 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