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

vsdwdz23  于 2022-11-28  发布在  Redis
关注(0)|答案(6)|浏览(275)

我尝试使用--pipe特性导入一百万行redis命令。

redis版本:2.8.1

cat file.txt | redis-cli --pipe
这将导致以下错误:
从服务器阅读时出错:对等方重置连接
有人知道我做错了什么吗?
file.txt包含例如

lpush name joe
lpush name bob

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

rbpvctlc

rbpvctlc1#

第一点是参数必须用双引号引起来。文档在这一点上有些误导。
因此,一个有效的语法是:

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

第二点是每行必须以\r\n结尾,而不仅仅是以\n结尾。
例如:unix2dos file.txt
然后可以使用cat file.txt | src/redis-cli --pipe导入文件
这对我很有效。

n8ghc7c1

n8ghc7c12#

要使用管道模式(也称为bulk loading, or 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

Python示例redis-tools包中提供。

ntjbwcob

ntjbwcob3#

现有工具可将客户端命令直接转换为Redis Wire协议消息。例如:
我的客户端脚本文件|redis-cli --管道选项
https://golanglibs.com/dig_in/redis-masshttps://github.com/almeida/redis-mass显示器

tgabmvqs

tgabmvqs4#

有两种可能性。
第一个检查点超出了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"

然后我尝试使用pipe命令,结果如下。

[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?

2w3kk1z5

2w3kk1z55#

发生此错误的原因是Redis中的超时设置为默认值0。您需要使用以下命令通过redis-cli配置此超时值:
要连接到redis服务器:重定向-CLI-H-P-A
要查看配置的超时值:此命令行:* * config get timemout**,用于查看Redis服务器中配置的超时值。
要为redis超时设置新值:此命令行:* * config set timeout 120**,将超时时间设置为2分钟。因此,您需要将redis超时时间设置为您的执行所需的时间。
我希望这些答案对你有帮助。

s3fp2yjn

s3fp2yjn6#

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

cat file.txt | xargs  -L1 redis-cli

相关问题