Массовая вставка Redis: протокол против встроенных команд

Для моей задачи мне нужно как можно быстрее загрузить большую часть данных в Redis. Похоже, эта статья правильно описывает мой случай: https://redis.io/topics/mass-insert

Статья начинается с примера использования нескольких встроенных команд SET с redis-cli. Затем они переходят к созданию протокола Redis и снова используют его с redis-cli. Они не объясняют причины или преимущества использования протокола Redis.

Использование протокола Redis немного сложнее и генерирует немного больше трафика. Интересно, каковы причины использовать протокол Redis, а не простые однострочные команды? Вероятно, несмотря на то, что данных больше, Redis легче (и быстрее) их анализировать?


person greatvovan    schedule 01.08.2017    source источник
comment
› чтобы скормить его Redis как можно быстрее   -  person Tuan Anh Tran    schedule 01.08.2017


Ответы (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: ~/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
person Niloct    schedule 01.08.2017