Redis 批量插入 HSET 命令



我一直在寻找一个可行的解决方案,但没有运气:/

我想使用 redis-clipipelining 功能执行批量插入,但我无法这样做。

我有一个 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

我做错了什么吗??请帮忙。

仅供参考:我提到了这些问题:

  1. 雷迪斯批量插入
  2. 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 文件(因此在 bashdash 中,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

相关内容

  • 没有找到相关文章

最新更新