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
Другие вопросы по тегам