【发布时间】:2021-10-05 09:05:17
【问题描述】:
我想在 bash 脚本中执行以下操作:
num_total_keys=0x1FFFF
for ((i = 0; i <= $num_total_keys; i++))
do
redis-cli SET some_prefix:$i True > /dev/null
done
但是,当我执行此操作时,它需要很长时间。有没有更有效的方法来做到这一点?
【问题讨论】:
我想在 bash 脚本中执行以下操作:
num_total_keys=0x1FFFF
for ((i = 0; i <= $num_total_keys; i++))
do
redis-cli SET some_prefix:$i True > /dev/null
done
但是,当我执行此操作时,它需要很长时间。有没有更有效的方法来做到这一点?
【问题讨论】:
经验法则:
如果您的命令接受流水线数据/指令;不要在 shell 循环中重复运行您的命令,而是在将其作为单个调用传递给您的命令之前构建所有命令,如下所示:
#!/usr/bin/env sh
i=131071
while [ $i -ge 0 ]; do
printf 'SET some_prefix:%d True\n' $i
i=$((i - 1))
done | redis-cli --pipe
或者使用 Bash 的 brace expansion:
printf 'SET some_prefix:%d True\n' {131071..0} | redis-cli --pipe
【讨论】:
redis-cli --pipe,这些命令的运行速度会快大约 10 倍。看看这里...redis.io/topics/mass-insert
printf 命令中可能需要使用\r\n 而不是\n。见stackoverflow.com/a/35093371/5762785