我正在尝试使用--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
答案 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权限。检查以下链接。
答案 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