使用--pipe进行redis批量导入

时间:2014-01-01 00:21:10

标签: redis

我正在尝试使用--pipe功能导入一百万行redis命令。

redis_version:2.8.1

cat file.txt | redis-cli --pipe

这会导致以下错误:

从服务器读取时出错:通过对等方重置连接

有谁知道我做错了什么?

例如,

file.txt包含

lpush name joe
lpush name bob

编辑:我现在看到使用管道模式可能有一种特殊格式(?) - http://redis.io/topics/protocol

6 个答案:

答案 0 :(得分:12)

第一点是参数必须是双引号。在这一点上,文档有些误导。

所以一个有效的语法是:

lpush "name" "joe"
lpush "name" "bob"

第二点是每一行必须以\r\n而不是\n结束。要解决这一问题,您只需使用命令unix2dos

转换文件

喜欢:unix2dos file.txt

然后,您可以使用cat file.txt | src/redis-cli --pipe

导入文件

这对我有用。

答案 1 :(得分:7)

要使用竖线模式(a.k.a mass insertion),您必须确实以Redis protocol格式直接提供命令。

LPUSH name joe的相应Redis协议是:

*3
$5
LPUSH
$4
name
$3
joe

或者作为带引号的字符串:"*3\r\n$5\r\nLPUSH\r\n$4\r\nname\r\n$3\r\njoe\r\n"

这是您的输入文件必须包含的内容。

Redis documentation包含一个Ruby示例,可帮助您生成协议:请参阅gen_redis_proto

答案 2 :(得分:1)

现有工具可将客户端命令直接转换为redis有线协议消息。例如:

redis-mass my-client-script.txt | redis-cli --pipe选项

https://golanglibs.com/dig_in/redis-mass https://github.com/almeida/redis-mass

答案 3 :(得分:0)

有两种可能性。

第一个检查点超出了maxclients限制。

您可以使用'info clients'和'config get maxclients'redis命令进行检查。

在我的桌面结果如下。

127.0.0.1:6379> info clients
# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
127.0.0.1:6379> config get maxclients
1) "maxclients"
2) "2"

然后我尝试使用管道命令,下面是结果。

[localhost redis-2.8.1]$ cat test.txt | ./src/redis-cli --pipe
All data transferred. Waiting for the last reply...
Error reading from the server: Connection reset by peer

如果结果相同。你必须改变redis.conf文件。

秒检查点是ulimit选项。

ulimit选项更改需要root权限。检查以下链接。

How do I change the number of open files limit in Linux?

答案 4 :(得分:0)

发生此错误是因为Redis中设置的超时为Default,0。您需要使用以下命令通过redis-cli配置此超时值:

要在redis服务器中连接: redis-cli -h -p -a

查看配置的超时值: 此命令行: config get timemout ,Works以查看在Redis服务器中配置的超时值是什么。

为redis超时设置新值: 此命令行: config set timeout 120 ,将超时设置为2分钟。因此,您需要在执行需要的时间内设置redis超时。

我希望这些答案可以帮到你。 CYU !!!

答案 5 :(得分:-3)

您可以使用以下命令将文件的数据导入redis

cat file.txt | xargs  -L1 redis-cli