我一直在寻找一个可行的解决方案,但没有运气:/
我想使用 redis-cli
的 pipelining
功能执行批量插入,但我无法这样做。
我有一个 JAVA 代码片段,它创建了一个包含所有要运行的命令的文件。
String add = "*4rn$4rnHSETrn$22rndiscountProgramOffersrn$" +
key.getBytes().length + "rn" + key + "rn$" +
json.getBytes().length + "rn" + json + "rn";
System.out.println(add);
在上面的代码中,我遵循了 Redis 文档站点上存在的大量插入链接。
这是一个正在创建的演示字符串。
*4rn$4rnHSETrn$22rndiscountProgramOffersrn$5rnmykeyrn$7rnmyvaluern
当我运行由代码片段创建的文件时,有时我什么也得不到,有时我会收到此错误:
Error writing to the server: Connection reset by peer
前任:
echo -e "$(cat massInsert.txt)" | redis/src/redis-cli --pipe
Error writing to the server: Connection reset by peer
我做错了什么吗??请帮忙。
仅供参考:我提到了这些问题:
- 雷迪斯批量插入
- Redis - 大量插入和计数器
在创建 RESP 协议字符串时看起来像一个简单的错误:)discountProgramOffers
哈希名称中有 21 个字符,而不是 22 个字符。
它对我有用(也使用 printf
而不是 echo -e
),但仅在 Alpine 的外壳ash
中(有关详细信息,请参阅另一个答案):
# inspect data
$ cat redis-cmd-tst.txt
*4rn$4rnHSETrn$21rndiscountProgramOffersrn$5rnmykeyrn$7rnmyvaluern
# transfer
$ echo -e $(cat redis-cmd-tst.txt) | redis-cli --pipe -a $REDIS_PASSWORD
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 1
# verify
$ redis-cli -a $REDIS_PASSWORD hget discountProgramOffers mykey
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"myvalue"
如果你做的一切都正确,但它仍然不起作用,这可能是你的 Linux shell 的错,你可能需要切换 shell(例如,在 Alpine 上切换到 BusyBox
ash
,Redis 通常可以方便地安装,至少在容器化版本中)。
使用以下命令之一时,格式正确的 RESP 字符串应完整显示(即每个关键字和键或值名称在单独的行中):
$ printf $(cat redis-cmd-tst.txt)
*1
$4
HSET
$21
discountProgramOffers
$6
mykey1
$8
myvalue1
$ echo -e $(cat /tmp/tst/redis-cmd-tst.txt)
*1
$4
HSET
$21
discountProgramOffers
$6
mykey1
$8
myvalue1
目前,我已经验证了它在 Alpine 上的 BusyBox ash
(链接到 /bin/sh
)中的工作:
$ echo $0
/bin/ash
$ /bin/ash --help
BusyBox v1.35.0 (2022-08-01 15:14:44 UTC) multi-call binary.
Usage: ash [-il] [-|+Cabefmnuvx] [-|+o OPT]... [-c 'SCRIPT' [ARG0 ARGS] | FILE ARGS | -s ARGS]
Unix shell interpreter
$ cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.16.2
PRETTY_NAME="Alpine Linux v3.16"
。虽然它无法在 Ubuntu 上预装的任何 shell 中正确打印 RESP 文件(因此在 bash
和 dash
中,sh
在 Ubuntu 上链接到):
$ printf $(cat dict-to-redis-working.txt)
$ echo -e $(cat dict-to-redis-working.txt)
31T3
$ echo $0
/bin/dash
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"
VERSION_ID="20.04"
UBUNTU_CODENAME=focal