Redis - пакетное добавление большого количества данных

Если у вас есть очень много данных (миллионы записей), которые вам необходимо запихать в Redis, делать это через PHP может быть опрометчиво, так как это займет очень много времени.

Redis-cli

Из коробки Redis умеет пакетное добавление данных через redis-cli с параметром --pipe:

$ cat data.txt
"SET" "KEY1" "VALUE1"\r\n
"SET" "KEY2" "VALUE2"\r\n
"SET" "KEY3" "VALUE3"\r\n
$ cat data.txt | redis-cli --pipe

Но тут есть небольшая проблема. redis-cli не сможет считать строки длинее 4096 байт. Так что если у вас VALUE очень большие, то вам необходимо другое решение.

После некоторых изысканий, я наткнулся на решение данной проблемы. Для импорта очень длинных строк можно использовать redis protocol, который умеет работать с любыми данными.

Формат файла data.txt теперь такой:

*3\r\n
// Тут *3 - это кол-во полей
$3\r\n // Тут $3 - это длина поля. Так как мы используем SET, то длина 3
SET\r\n
$5\r\n // 5 - длина поля
mykey\r\n
$100000\r\n // 100000 - длина поля
{100000 байт}\r\n

Обратите внимание, что переводы строк обязательно должны бы ть в формате "\r\n", иначе redis вас не поймет. Однако redis-cli не поддерживает этот формат, так что нам придется использовать например NetCat:

$ cat data.txt | nc localhost 6379

Таким вот нехитрым образом вы можете импортировать в Redis миллионы записей любой длины.

Опубликовано:

Категории: Статьи